|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
『楼 主』:
自动设置IP,计算机名和工作组出错
使用 LLM 解释/回答一下
min.txt文件在C盘根目录,内容是20台机子的MAC.IP和计算机名,分为三列,第一列是MAC地址,第二列是IP地址,第三列是计算机名,各列之间用一个空格隔开,比如第一行是:AA-BB-CC-DD-EE-FF 192.168.1.1 PC-01
我想实现的是每台机子运行批处理后,能够通过查询本机网卡物理地址,再与TXT中每行第一列对此,当相同时,将本机IP设置为那一行第二列的地址,计算机名设置为第三列的名字,我的批处理内容是:
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i /c:"physical address"') do (
for /f "tokens=1,2* delims= " %%m in (c:\min.txt) do (
if %%i==%%m netsh interface ip set address name=本地连接 source=static addr=%%n mask=255.255.255.0))
运行时总是有问题,后来发现第一个循环在获取本机网卡物理地址后会在最前面加一个空格然后才传给%%i,所以我将代码改为:
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i /c:"physical address"') do (
set a=%%i
set b=%a =%
for /f "tokens=1,2* delims= " %%m in (c:\min.txt) do (
if %b%==%%m netsh interface ip set address name=本地连接 source=static addr=%%n mask=255.255.255.0))
依然运行不成功
麻烦版主看一下,另外我还想改计算机名和工作组(组名为mshome),不知怎么实现,麻烦大家帮帮忙,万分感谢!
Last edited by xinjingdos on 2010-11-15 at 00:32 ]
|
|
2010-11-14 01:36 |
|
|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
|
2010-11-14 15:04 |
|
|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
|
2010-11-15 20:41 |
|
|
samgege
新手上路

积分 5
发帖 7
注册 2010-11-14
状态 离线
|
|
2010-11-16 19:32 |
|
|
不得不爱
超级版主
         我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
『第 5 楼』:
使用 LLM 解释/回答一下
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i
/c:"physical address"') do (set a=%%i
call :bb)
:bb
set a=%a: =%
for /f "tokens=1,2* delims= " %%m in (c:\min.txt) do if %a%==%%m netsh interface ip set address name=本地连接 source=static addr=%%n mask=255.255.255.0
Last edited by 不得不爱 on 2010-11-17 at 09:41 ]
|

我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件 |
|
2010-11-17 09:40 |
|
|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
『第 6 楼』:
使用 LLM 解释/回答一下
谢谢,超版,能不能为我解释一下,为什么我直接那样写就不能实现,而是要改为调用子过程才能实现的?
另外我还想更改计算机名和工作组名,我在论坛上搜的
wmic computersystem where "name='%computername%'" call rename "%%o"
wmic computersystem where Name="%COMPUTERNAME%" call JoinDomainOrWorkgroup Name="MSHOME"可以加入子过程吗?上次我单独用一个命令修改计算机名,没有成功,是要重启才能更改吗?
麻烦版主了,谢谢
|
|
2010-11-17 14:27 |
|
|
huahua0919
银牌会员
    
积分 1608
发帖 780
注册 2007-10-7
状态 离线
|
『第 7 楼』:
使用 LLM 解释/回答一下
即使在图形界面下修改工作组也是要重新启动电脑的。
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('ipconfig/all ^|findstr /i /c:" Physical Address"') do (
for /f "tokens=2 delims=:" %%a in ("%%i") do (
set a=%%a
set a=!a: =!
)
for /f "tokens=1-3 delims= " %%a in (min.txt) do (
if /i "!a!"=="%%a" (
netsh interface ip set address name=本地连接 source=static addr=%%b mask=255.255.255.0
wmic computersystem where "name='%computername%'" call rename "%%c"
wmic computersystem where Name="%computername%" call JoinDomainOrWorkgroup name="mshome"
)
)
)
pause
|

http://www.godule.com |
|
2010-11-17 15:30 |
|
|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
『第 8 楼』:
使用 LLM 解释/回答一下
谢谢大家,用版主的代码实现了,用楼上兄弟的不知道为什么有问题,为什么我的代码就实现不了呢?是批处理程序本身的问题吗?
|
|
2010-11-20 18:31 |
|
|
不得不爱
超级版主
         我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
『第 9 楼』:
使用 LLM 解释/回答一下
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i /c:"physical address"') do set a=%%i
set a=%a: =%
for /f "tokens=1,2* delims= " %%m in (c:\min.txt) do if %a%==%%m (netsh interface ip set address name=本地连接 source=static addr=%%n mask=255.255.255.0
wmic computersystem where "name='%computername%'" call rename "%%o"
wmic computersystem where Name="%COMPUTERNAME%" call JoinDomainOrWorkgroup Name="MSHOME")
是你要的结果吧?
不知道为什么,好像IF 在处理延迟上有点问题,所以我就没有使用延迟变量,而使用调用过程,使用延迟变量处理这个问题会出错......有点奇怪!
Last edited by 不得不爱 on 2010-11-25 at 20:19 ]
|

我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件 |
|
2010-11-25 19:51 |
|
|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
『第 10 楼』:
使用 LLM 解释/回答一下
嗯,我一开始也用了变量延迟,但结果还是不对,后来用版主的调用子过程解决了,原来是if处理延迟的问题,谢谢版主解答
|
|
2010-12-3 03:05 |
|
|
Hanyeguxing
银牌会员
     正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
『第 11 楼』:
使用 LLM 解释/回答一下
问题1,关于楼主在1楼说的空格的问题,那是因为本来输出的就是:+空格+内容,以冒号分隔时,%%i就必然前面带着空格。
问题2,至于楼主问为什么去了空格也还出错,ipconfig的“输出格式化”与for /f“解析”之间的冲突。
ipconfig 输出的换行是“0D 0D 0A”,而for /f解析时只把后面的“0D 0A”当成换行标志,把把前面的“0D”当成行内的字符来处理,这样解析出来的变量就比我们实际看到的多出一个字符(0D),显然 if 比较时就必然是不同的。
那为什么ipconfig直接输出到文本时就看不到呢?那是因为这些文本查看软件(例如记事本程序)在处理“0D 0D 0A”和“0D 0A”时,都当成一个换行标志来看,如果输出的是“0D 0D 0D 0D 0A”,查看软件会自动把后面“0D 0D 0A”当成换行,而把前面的“0D 0D”处理成黑方块的字符。在cmd中运行ipconfig,cmd也是这样显示文本的。
问题3,为什么使用call调用子标签就可以了,那是因为调用过程中传递参数时,所有单独的 0D 字符都被脱掉了!
Last edited by Hanyeguxing on 2010-12-4 at 08:50 ]
|

批处理之家 http://bbs.bathome.net/forum-5-1.html |
|
2010-12-3 08:30 |
|
|
xinjingdos
新手上路

积分 14
发帖 14
注册 2010-8-30
状态 离线
|
『第 12 楼』:
使用 LLM 解释/回答一下
首先谢谢楼上的大侠!
对于问题一,我明白了,因为ipconfig所显示的内容中,冒号右边就有一个空格,所以在for中,delims=:时,就会在变量中含有一个空格,我修改tokens并且delims= ,就可以得到不带空格的值了,在这里我想了一下,能不能用冒号加空格作为delims,自己试了下不行,会把冒号和空格均作为分隔,大侠能不能告诉我这样的想法能实现吗?谢谢
对于问题二,讲得比较深,我能理解一部分,我想问一下,那些0D 0A的字符是通过什么软件看到的?
对于问题三,因为自己没什么基础,我就当新知识直接接受了
|
|
2010-12-4 00:04 |
|
|
jun19841
初级用户
 
积分 55
发帖 29
注册 2006-4-11 来自 亚洲
状态 离线
|
|
2010-12-6 16:17 |
|