Windows 制作一个批处理文件,首先ping一个IP地址并验证它';在设置IPv4的IP地址之前不使用;“本地连接”;

Windows 制作一个批处理文件,首先ping一个IP地址并验证它';在设置IPv4的IP地址之前不使用;“本地连接”;,windows,batch-file,cmd,ping,Windows,Batch File,Cmd,Ping,我目前在一家酿酒厂工作,该厂主要使用基于以太网的控制网络,专用于所有自动化设备。为了节省时间,我为酿酒厂的每个系统创建了一个批处理文件,以便当我在工厂的不同地方时能够快速更改计算机的IP地址。我创建了这个批处理文件目录,并将它们放在我们的服务器上,以便我们的维护人员可以访问它们。虽然这样做很好,但我想到,如果多人试图以这种方式上网,网络上就会有冲突的IP地址 我试图将批处理文件修改为第一个平安IP地址(10.120.194.254),然后根据结果,将IPv4“局域网连接”更改为该IP地址或继续到

我目前在一家酿酒厂工作,该厂主要使用基于以太网的控制网络,专用于所有自动化设备。为了节省时间,我为酿酒厂的每个系统创建了一个批处理文件,以便当我在工厂的不同地方时能够快速更改计算机的IP地址。我创建了这个批处理文件目录,并将它们放在我们的服务器上,以便我们的维护人员可以访问它们。虽然这样做很好,但我想到,如果多人试图以这种方式上网,网络上就会有冲突的IP地址

我试图将批处理文件修改为第一个平安IP地址(10.120.194.254),然后根据结果,将IPv4“局域网连接”更改为该IP地址或继续到下一个可用IP地址(10.120.194.253)。。。(10.120.194.252)... 等等我的理想目标是对5个IP地址执行相同的过程,然后如果所有IP地址都不成功,则显示一个对话框,其中显示一条消息以检查网络上的用户数。通常,IP地址xxx.xxx.xxx.250-254用于在网络上编程,因此这就是其背后的原因。一个网络上有这么多用户的概率很低,但对于“以防万一”的场景来说,这将是一个很好的特性

下面是我的原始批处理文件代码,用于更改IPv4“局域网连接”的IP地址

我尝试使用errorlevel函数,但在ping网络时无法获得一致的结果。此外,每次我发表平安讲话,它都会进行4次投票,然后再进行下一次投票。有没有办法缩短这次投票时间?下面是我一直在尝试使用的批处理文件的代码:

@echo off

ping "10.120.194.254"

IF %errorlevel%==0 GOTO IP_Attempt2
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.254 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt2

ping "10.120.194.253"

IF %errorlevel%==0 GOTO IP_Attempt3
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.253 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt3

ping "10.120.194.252"

IF %errorlevel%==0 GOTO IP_Attempt4
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.252 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt4

ping "10.120.194.251"

IF %errorlevel%==0 GOTO IP_Attempt5
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.251 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt5

ping "10.120.194.250"

IF %errorlevel%==0 GOTO Max_IP_Attempts
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.250 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:Max_IP_Attempts

echo Max attempts have been made with this batch file. Verify users on the network.
pause
exit /b
在运行批处理文件后,我附加了CMD提示符窗口的快照:

来自:

成功的PING并不总是返回
0
0的
%errorlevel%
因此,为了可靠地检测成功的ping,将输出导入
查找
并查找文本“TTL”

在您的实例中,您需要将
FIND
的输出通过管道传输到带有
FOR
循环的变量中。如果
FIND
在输出文本中未找到“TTL”,则不会定义变量。您可以检查变量是否已定义以定义结果(移动到下一个IP或将当前IP设置为本地地址)。 在您的脚本中,这可能类似于:

FOR /F "delims=" %%f IN ('ping "IP" ^| find "TTL"') DO (SET tempVar=%%f)
IF NOT DEFINED tempVAR netsh interface IPv4 set address name="Local Area Connection" static IP 255.255.255.0 & netsh interface IPv4 set dns name="Local Area Connection" source=dhcp & EXIT /B
GOTO IP_Attempt$
在第一行中,
|
ping
的输出导入
find
命令(|用插入符号转义)。第二行是
IF
语句的重新实现
&
将命令链接在一起,以便在同一
IF
子句中处理它们。如果
If
子句不匹配,第三行将转到下一个标签

此外,每次我发表平安讲话,它都会进行4次投票,然后再进行下一次投票。有没有办法缩短这次投票时间

尝试ping-n 1 target\u IP。在继续之前,它只会发出一次ping。 对于大多数内置命令,您可以通过在CMD中尝试
[command]/?
获得令人满意的功能打印输出

,如果你被卡住了,它们也是很好的参考资料


希望这有帮助。这也是我的第一篇文章,所以如果我有什么不清楚的地方(或者您还有其他问题),请随时提问。

阅读您的问题似乎可以归结为以下问题:

如何使用windows批处理文件在子网中查找已用或可用的IP地址

答案基本上由三行代码和一些解释组成:

if exist ips.txt del ips.txt > nul

echo Please enter the first 24 bits of your subnet (e.g. 192.168.0):
set /p ip=

for /L %%N IN (1, 1, 254) DO (
    echo pinging %ip%.%%N
    ping %ip%.%%N -n 1 -w 1 | find "TTL" && echo %ip%.%%N >> ips.txt
)

cls
type ips.txt
响应单个ping的每个IP都会写入
ips.txt
。这就是你的“不要使用”清单。 您可以轻松地自定义此代码段,使其每n分钟自动工作一次,无需用户输入,或者输出免费IP并忽略已使用的IP

如果要在脚本找到可用ip地址后自动设置ip地址,请使用
netsh interface ip set address“LAN”static%ip%%subnet%%gateway%
。有关使用
netsh
的更多信息,请阅读或



虽然这种方法可能完全适合您的需要,但应该考虑对每个站点使用基于DHCP的ip管理或固定ip。但这不是你问题的重点。有关网络和基础设施管理的帮助可以在其他社区找到。

您应该在开始时设置“tempVar=”,以确保它绝对没有定义。无论如何,当查询
find
ErrorLevel
时,如果找到
TTL=
(是的,应该包括
=
),则返回
0
,否则:
如果ErrorLevel 1 netsh…
。或者您可以使用:
ping“IP”| find“TTL=”| | netsh…
…您好,欢迎来到StackOverflow。这对我来说是一个很好的第一次贡献。我编辑了你的一些格式,我建议你将最后一段移到评论部分,因为它不是你答案的重要部分。我试图使用你的示例代码,但运气不好。我使用列表中的下一个可用IP地址复制了两次For指令。第一个IP地址ping成功,并获得TTL值为128的回复。下一个For指令没有成功ping,指令没有设置IP地址,而是转到下一个标签,在那里我暂停检查批处理文件的整体操作。我看到的所有说明都引用了一个.txt文件,这不是我想要做的。有没有更简单的方法来寻找“TTL”的存在?时间很长
if exist ips.txt del ips.txt > nul

echo Please enter the first 24 bits of your subnet (e.g. 192.168.0):
set /p ip=

for /L %%N IN (1, 1, 254) DO (
    echo pinging %ip%.%%N
    ping %ip%.%%N -n 1 -w 1 | find "TTL" && echo %ip%.%%N >> ips.txt
)

cls
type ips.txt