Board logo

标题: 已结:关于自动变换IP地址问题(XP) [打印本页]

作者: ronin     时间: 2005-11-10 13:42    标题: 已结:关于自动变换IP地址问题(XP)

参考资料:
http://www.cn-dos.net/forum/viewthread.php?tid=16990&fpage=12
http://www.cn-dos.net/forum/viewthread.php?tid=17272&fpage=8

问题是:用批处理自动修改XP的IP地址、子网掩码、网关,因为是公司使用,不能都用同一个IP地址,希望是给一段Ip范围比如:192.168.1.*,*是随机分配,限制范围比如:100-200
请问大家怎么来写这个批处理文件

网上找到的资料,大家也参考下
http://www.btvgd.com/net/bbs/top ... =f_8&forumid=10

[ Last edited by willsort on 2005-11-30 at 19:53 ]
作者: willsort     时间: 2005-11-10 20:49
Re ronin:

      IP地址等网络配置的修改和产生随机IP都没有什么问题。问题在于如何保证随机IP不会重复,100-200只有101个值,如果运行主机超过20台,便会有很高的可能性发生重复。另外,因为这个批处理可能在多个不同机器上运行,所以一般不考虑生成已占用IP列表的方法,而最好能以个机的特有值做种,以特定散列函数生成唯一对应的值。各位不知对此有何高见?当然如果 ronin 兄有其它折中的方法也不妨提出。
作者: ronin     时间: 2005-11-11 11:00
可以将范围拉大到100-250这样来生产随机IP地址,一般电脑数量不多,不用考虑重复,如果遇到重复会有提示,这样就重新再运行一次就行,这个问题产生是因为公司电脑系统都是用GHOST,所以IP都是一样,打算就是在GHOST完成以后运行下运行下这个批处理来避开IP重复
作者: ronin     时间: 2005-11-11 20:43
http://www.pzz.cn/bbs/read.php?tid=4658&fpage=1
我试了没有成功
作者: JonePeng     时间: 2005-11-11 22:30
不如将路由器设为允许DHCP,将IP地址的范围(第四位数)设为100~200,再把每台机器的IP和DNS设置都设为自动获取,这样就使每台机在启动进入系统时都自动获取IP,无须手动配置。
作者: ronin     时间: 2005-11-11 22:40
因为客户网络环境不能自己控制,我是做客服工作的
set x=%random:~-1%
set x1=%random:~-1%
;echo Random number: %x%
::把的得到的随机数写入 Wattcp.txt 文件
echo IP=192.168.1.1%x%%x1%> Wattcp.txt
echo NETMASK=255.255.255.0>> Wattcp.txt
echo GATEWAY=192.168.1.1>> Wattcp.txt

基本上已经取得IP控制在100-199范围,不知道有什么办法指定Random number在100-254范围?
作者: ronin     时间: 2005-11-11 23:00
@echo off
set x=%random:~-1%
set x1=%random:~-1%
set eth="本地连接"
set ip=192.168.1.1%x%%x1%
set gateway=192.168.1.1
set netmasks=255.255.255.0

最后写出来的批处理,感觉应该是对的,但是却没有改动本地连接的IP,请问出错在那里
作者: 无奈何     时间: 2005-11-12 00:27
你始终是在设置的环境变量,怎么会更改IP呢。要进入netsh 设置模式。
给你转段文章看看是否有启发。

  Quote:
   在工作过程中会遇到在不同的网段中进行网络调试的情况,经常需要将机器在几个不同的IP地址中进行切换。在Win2000*作系统中改变IP地址较之Win98已经方便多了因为改完IP地址后不需要重启计算机,但还要进入网络属性设置中进行*作。有没有再简便一点的方法呢,比如用鼠标双击一下快捷方式就可以实现IP地址的切换?
   
     答案是肯定的。在Win2000中用netsh命令就可以实现这个功能。首先进入命令行模式(在“开始→运行”中键入“cmd”即可进入命令行模式),在提示符下键入netsh即可进入netsh的界面。再键入int ip进入接口IP的配置模式,键入dump则列出接口IP配置信息:
   
     C:\Documents and Settings\Administrator>netsh
     netsh>
     netsh>int ip
     interface ip>dump
     # ----------------------------------
     # 接口 IP 配置
     # ----------------------------------
     pushd interface ip
     # ″本地连接″ 的接口IP 配置(注:以下显示视具体机器情况而定)
     set address name = ″本地连接″ source = static addr = 192.168.0.5 mask = 255.255.255.0
     set address name = ″本地连接″ gateway = 192.168.0.2 gwmetric = 1
     set dns name = ″本地连接″ source = static addr = 61.237.17.181
     add dns name = ″本地连接″ addr = 211.97.168.129
     add dns name = ″本地连接″ addr = 211.98.4.1
     set wins name = ″本地连接″ source = static addr = none
     # ″本地连接 2″ 的接口 IP 配置
     set address name = ″本地连接 2″ source = dhcp
     set dns name = ″本地连接 2″ source = dhcp
     set wins name = ″本地连接 2″ source = dhcp
     popd
     # 接口 IP 配置结束
   
   快速切换IP地址有绝招 2
   
   
   现在我们可以大致了解到用netsh命令更改IP地址的方式,即通过“set address name =连接名称(连接名称要用引号括起来)source=static addr=IP地址 mask=子网掩码”来实现。
   
     到命令行模式下用netsh直接试一下。比如要将本机的IP地址改为192.168.0.7,子网掩码为255.255.255.0,可以进行以下*作:
   
     C:\Documents and Settings\Administrator>netsh
     netsh>int ip
     interface ip>set address name ="本地连接"source = static addr = 192.168.0.7 mask = 255.255.255.0
     确认更改。
     interface ip>exit
     再用ipconfig命令核实一下:
     C:\Documents and Settings\Administrator>ipconfig
     Windows 2000 IP Configuration
     Ethernet adapter 本地连接 2
     Media State . . . . . . . . . . .  Cable Disconnected
     Ethernet adapter 本地连接
     Connection-specific DNS Suffix . 
     IP Address. . . . . . . . . . . .  192.168.0.7
     Subnet Mask . . . . . . . . . . .  255.255.255.0
     Default Gateway . . . . . . . . .  192.168.0.2


作者: ronin     时间: 2005-11-12 14:13
我做了批处理,用netsh不行
作者: willsort     时间: 2005-11-12 19:14
Re ronin:

      在XP中,可以在批处理中使用 netsh 配置几乎所有的网络信息。样例如下:

netsh interface ip set address "本地连接" static 10.0.0.5 255.255.255.0 10.0.0.4 1
netsh interface ip set dns "本地连接" static 10.0.0.4

  而产生随机IP可以使用set/a对随机变量%random%进行运算得到。

set rndip=%random%
set /a rndip=rndip%156+100
作者: ronin     时间: 2005-11-12 21:22
谢谢willsort、无奈何、JonePeng帮助,已经弄好了,用下边的批处理完全没有问题
set x=%random:~-1%
set x1=%random:~-1%
netsh interface ip set address "本地连接" static 192.168.1.1%x%%x1% 255.255.255.0 192.168.1.1 1
作者: ronin     时间: 2005-11-14 10:38    标题: 关于XP检测本地连接问题

接上次的问题
netsh interface ip set address "本地连接" static 192.168.1.1%x%%x1% 255.255.255.0 192.168.1.1 1

使用中发现,因为更换网卡或者其它问题,很多电脑都不是用“本地连接”,很多是用“本地连接 3”这样的,这个批处理就会出错,能不能使用批处理检测到本地连接用哪一个,或者就是直接用LOCAL替换?
作者: unique009     时间: 2005-11-14 11:17
这个问题我也挺想知道
作者: willsort     时间: 2005-11-14 17:51

——————————————  Edited by willsort  ——————————————
合并主题:《17732 - 关于XP检测本地连接问题》
合并理由:二主题存在上下文的直接联系

删除回帖: voiL 和 ronin  的三篇回帖
删除理由:回帖内容为问答两主题之间关系
两位可以在以下的回帖中要求积分补偿
——————————————  Edited by willsort  ——————————————


Re ronin:

      关于获取连接名字,也可以使用 netsh ,目前我所找到的途径是:

netsh interface dump

      用 for + set + if 可以得到并判断出其中存在的连接名。以下给出批处理中的代码示例,将得到结果存入环境变量 addressname 中,应该不太周全,建议先详细测试再实际应用。

for /f "tokens=1,2,3" %%a in ('netsh interface dump') do if "%%b"=="address" echo %%a %%b%%c

[ Last edited by willsort on 2005-11-14 at 20:32 ]
作者: chenhui530     时间: 2005-11-15 14:08
获取连接名字:
for /f "skip=3 tokens=1,2,3 delims=: " %%a in ('ipconfig') do for %%A  in (%%c) do set a=%%A && goto view

:view
echo %a%  
pause
作者: willsort     时间: 2005-11-15 16:27
Re chenhui530:

      你我的方法应该都忽略了连接名中存在空格和冒号的情形,根据你的代码略作修改。

      有趣的是,据此发现 ipconfig 的命令输出中,每行文本的结尾都是两个回车符(0x0D)和一个换行符(0x0A),所以在最初使用 delims=2* 测试时,出现了一系列有趣的设置混乱,比如我可以用它实现隐藏环境变量名的首字符。不过后来记起在论坛中已经有 无奈何 兄首先发现了这个现象,链接如下:

(已结)請問如何抓取文件中的某一行特定文字
http://www.cn-dos.net/forum/viewthread.php?tid=17443#pid102925

      不知这是程序的BUG,还是在某些特殊应用中的特殊需求。不过它确实给我们在批处理中的使用带来了一些小麻烦。
@echo off
for /f "skip=3 tokens=2*" %%a in ('ipconfig') do set AccessName=%%b&& goto AccName2

:AccName2
set AccessName=%AccessName:~0,-2%
echo Access: "%AccessName%"
[ Last edited by willsort on 2005-11-15 at 16:29 ]
作者: ronin     时间: 2005-11-15 20:22
试了下,运行应该没什么问题,有没有考虑到多网卡情况?
作者: zreo     时间: 2005-11-17 13:27


  Quote:
@echo off
for /f "skip=3 tokens=2*" %%a in ('ipconfig') do set AccessName=%%b&& goto AccName2

:AccName2
set AccessName=%AccessName:~0,-2%

我想请问一下。这里的set accessname=%%b 这是为什么。
还有SET accessname=%Accessname:~0,-2%
能跟我讲解一下这个命令吗?
作者: ronin     时间: 2005-11-18 15:46
在win2000试了,有本地连接2的,出错,参数找到市正确
@echo off
for /f "skip=3 tokens=2*" %%a in ('ipconfig') do set AccessName=%%b&& goto AccName2

:AccName2
set AccessName=%AccessName:~0,-2%
echo Access: "%AccessName%"
set x=%random:~-1%
set x1=%random:~-1%
netsh interface ip set address "%AccessName%"" static 192.168.1.1%x%%x1% 255.255.255.0 192.168.1.1 1

命令运行结果是:指定了无效端口 本地连接 2
作者: ronin     时间: 2005-11-18 19:42
netsh interface ip set dns "%AccessName%"" static 192.168.1.1,192.168.1.2,192.168.1.3

这样输入多个DNS会出错,怎么来处理
作者: ronin     时间: 2005-11-28 23:08
netsh interface ip add dns "本地连接" 202.96.128.166
netsh interface ip add dns "本地连接" 211.98.4.1 2
netsh interface ip add dns "本地连接" 211.94.33.193 3

设置多个DNS的批处理,上面分别是电信、铁通、联通DNS

自动设置IP和DNS在XP和WIN2003下已经通过测试,在WIN2000下会出错
作者: willsort     时间: 2005-11-30 13:22
Re ronin:

      17楼:因为我的测试机不存在多网卡的情形,所以无法测试并加以改进。

      19楼:多连接的情况中存在一个选择策略问题,这个就不是批处理本身的问题了。

      20/21楼:在Win2000下无法通过可能有两个原因:1、不支持或不完整的支持 netsh 命令;2、ipconfig 的输出不同于 XP。等见到使用 netsh 和 ipconfig 的输出结果后再看吧,将之重定向到文本中作为附件上传即可。

Re zero:

      使用 set /? 查阅 set 的命令行帮助便能得到很明确的答案了。

[ Last edited by willsort on 2005-11-30 at 13:23 ]
作者: ronin     时间: 2005-11-30 17:44
1、不支持或不完整的支持 netsh 命令

我估计是这个原因比较多