测试计算机是否在网络上可用
Test if computer is available on network
我在一家有很多商店的公司工作。每个店铺都有自己的IP地址:
商店 1 = 192.168.1.0/24,商店 2 = 192.168.2.0/24,商店 3 = 192.168.3.0/24,等等...
我在每个商店的同一子网 (255.255.255.0) 上有许多 Windows 台计算机(1 到 9 台)。
每台电脑都有一个静态IP地址:1st = 192.168.1.10, 2nd = 192.168.1.20, 3rd = 192.168.1.30, 4th = 192.168.1.40, etc.
我公司的总部只能在每个商店的第一台计算机上部署软件(许可证问题)。
在这里,我们将尝试在所有商店的所有 windows 计算机上安装 Xerox 驱动程序。
我制作了 3 个批处理脚本:
- 首先,以电脑的超级管理员身份启动,安装一个具有管理员权限的新用户来安装驱动程序
- 第二种,以新用户身份启动,安装 Xerox 驱动程序并将打印机设置为默认打印机。
第三,以电脑超级管理员身份启动,尝试在同店其他电脑上安装施乐驱动:
- 遍历我的 9 ip 地址
(for /l %%G in (...) do (...)
- 对于每个 IP 地址,测试它是否 ping。
- 在计算机 1 和 IP 地址之间进行 ftp 传输(驱动程序包 + 脚本)
- PsExec64.exe到运行第一个脚本
- PsExec64.exe到运行第二个脚本
第一个和第二个脚本完美运行,我们不会谈论它们。
我需要帮助的地方在第三个。
我尝试了 3 个脚本:
第一个:
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
ping -n 1 %subnet%%%G | findstr "TTL="
if %errorlevel%==0 (
echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
) else (
echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
)
)
这里 log_ping_errorlevel.txt 我的子网上有 2 台计算机:
Ping 192.168.1.20 : OK
Ping 192.168.1.30 : OK
Ping 192.168.1.40 : OK
Ping 192.168.1.50 : OK
Ping 192.168.1.60 : OK
Ping 192.168.1.70 : OK
Ping 192.168.1.80 : OK
Ping 192.168.1.90 : OK`
我试图用简单的引号将 %errorlevel% 和 0 括起来,但我得到了相同的结果。
如果我 运行 cmd window 中的批处理,这里是输出的摘录:
C:\Temp\Xerox_Install>(
ping -n 1 192.168.1.90 | findstr "TTL="
if '0'=='0' (echo "Ping 192.168.1.90 : OK" 1>>log_ping_errorlevel.txt ) el
se (echo "Ping 192.168.1.90 : KO" 1>>log_ping_errorlevel.txt )
)
在我的脚本中似乎错误级别总是= 0,不知道为什么。
第二个:
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
ping -n 1 %subnet%%%G && set pingtest=ok
if '%ping_test%'=='ok' (
echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
) else (
echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
)
)
这里 log_ping_set.txt 我的子网上有 2 台计算机:
Ping 192.168.1.20 : OK
Ping 192.168.1.30 : OK
Ping 192.168.1.40 : OK
Ping 192.168.1.50 : OK
Ping 192.168.1.60 : OK
Ping 192.168.1.70 : OK
Ping 192.168.1.80 : OK
Ping 192.168.1.90 : OK`
我认为 ping 命令结果总是 0 然后可以执行 setter pingtest。
第三个:
因为我坚持使用 ping 命令,所以我尝试了远程计算机上的 if exist 文件夹:
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
if exist \%subnet%%%G\C$\Temp\ (
echo Remote folder reachable >> log_folder_reachable.txt
) else (
echo ERROR 404 - Remote folder not found >> log_folder_reachable.txt
)
)
这里 log_folder_reachable.txt 我的子网上有 2 台计算机:
Remote folder reachable
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
它可以工作,但是 if exist 超时时间大约为 160 秒,我不想在转到下一台计算机之前等待 160 秒...
有人可以用任何方法帮助我但不使用外部工具吗?
您应该阅读有关 delayedexpansion
的 SO 项目。
if %errorlevel%==0 (
第一个脚本应该是
if not errorlevel 1 (
[显然,反转逻辑条件并删除 "not"]
if errorlevel 1
表示 "if errorlevel
is 1 or greater than 1" 并根据 运行-time 值 errorlevel
.[=28= 进行解释]
下一个:
ping -n 1 %subnet%%%G && set pingtest=ok
if '%ping_test%'=='ok' (
应该是
set "ping_test="
ping -n 1 %subnet%%%G && set "ping_test=ok"
if defined ping_test (
注释
您正在 ping
命令中设置 pingtest
,然后您正在尝试测试 ping_test
即使变量名是正确的,if
语句中引号的目的是将内容组合成一个字符串。单引号不切芥末,需要双引号。
根据您的代码,ping_test
设置后将在下一个循环中保留其值,您需要在ping
之前清除。
替换代码首先将ping_test
的值设置为nothing。引号分隔变量名称和值,以便行中的尾随空格 not 包含在分配的值中。然后 ping
命令可以将 ping_test
的值设置为(可以,但是 nothing 以外的任何值(即 something) 已验证)。 if defined
命令解释变量的运行-时间值。
第三部分 - 好吧,变得绝望了,但没有必要走这么远,因为我概述的更改应该可以解决问题。
关于您所说的尝试使用延迟扩展的第一组代码,它应该如下所示。在我的网络上测试并工作。
@echo off
setlocal enabledelayedexpansion
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
ping -n 1 %subnet%%%G | findstr "TTL="
if !errorlevel!==0 (
echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
) else (
echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
)
我在一家有很多商店的公司工作。每个店铺都有自己的IP地址: 商店 1 = 192.168.1.0/24,商店 2 = 192.168.2.0/24,商店 3 = 192.168.3.0/24,等等...
我在每个商店的同一子网 (255.255.255.0) 上有许多 Windows 台计算机(1 到 9 台)。 每台电脑都有一个静态IP地址:1st = 192.168.1.10, 2nd = 192.168.1.20, 3rd = 192.168.1.30, 4th = 192.168.1.40, etc.
我公司的总部只能在每个商店的第一台计算机上部署软件(许可证问题)。 在这里,我们将尝试在所有商店的所有 windows 计算机上安装 Xerox 驱动程序。
我制作了 3 个批处理脚本:
- 首先,以电脑的超级管理员身份启动,安装一个具有管理员权限的新用户来安装驱动程序
- 第二种,以新用户身份启动,安装 Xerox 驱动程序并将打印机设置为默认打印机。
第三,以电脑超级管理员身份启动,尝试在同店其他电脑上安装施乐驱动:
- 遍历我的 9 ip 地址
(for /l %%G in (...) do (...)
- 对于每个 IP 地址,测试它是否 ping。
- 在计算机 1 和 IP 地址之间进行 ftp 传输(驱动程序包 + 脚本)
- PsExec64.exe到运行第一个脚本
- PsExec64.exe到运行第二个脚本
- 遍历我的 9 ip 地址
第一个和第二个脚本完美运行,我们不会谈论它们。
我需要帮助的地方在第三个。
我尝试了 3 个脚本:
第一个:
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
ping -n 1 %subnet%%%G | findstr "TTL="
if %errorlevel%==0 (
echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
) else (
echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
)
)
这里 log_ping_errorlevel.txt 我的子网上有 2 台计算机:
Ping 192.168.1.20 : OK
Ping 192.168.1.30 : OK
Ping 192.168.1.40 : OK
Ping 192.168.1.50 : OK
Ping 192.168.1.60 : OK
Ping 192.168.1.70 : OK
Ping 192.168.1.80 : OK
Ping 192.168.1.90 : OK`
我试图用简单的引号将 %errorlevel% 和 0 括起来,但我得到了相同的结果。
如果我 运行 cmd window 中的批处理,这里是输出的摘录:
C:\Temp\Xerox_Install>(
ping -n 1 192.168.1.90 | findstr "TTL="
if '0'=='0' (echo "Ping 192.168.1.90 : OK" 1>>log_ping_errorlevel.txt ) el
se (echo "Ping 192.168.1.90 : KO" 1>>log_ping_errorlevel.txt )
)
在我的脚本中似乎错误级别总是= 0,不知道为什么。
第二个:
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
ping -n 1 %subnet%%%G && set pingtest=ok
if '%ping_test%'=='ok' (
echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
) else (
echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
)
)
这里 log_ping_set.txt 我的子网上有 2 台计算机:
Ping 192.168.1.20 : OK
Ping 192.168.1.30 : OK
Ping 192.168.1.40 : OK
Ping 192.168.1.50 : OK
Ping 192.168.1.60 : OK
Ping 192.168.1.70 : OK
Ping 192.168.1.80 : OK
Ping 192.168.1.90 : OK`
我认为 ping 命令结果总是 0 然后可以执行 setter pingtest。
第三个:
因为我坚持使用 ping 命令,所以我尝试了远程计算机上的 if exist 文件夹:
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
if exist \%subnet%%%G\C$\Temp\ (
echo Remote folder reachable >> log_folder_reachable.txt
) else (
echo ERROR 404 - Remote folder not found >> log_folder_reachable.txt
)
)
这里 log_folder_reachable.txt 我的子网上有 2 台计算机:
Remote folder reachable
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
它可以工作,但是 if exist 超时时间大约为 160 秒,我不想在转到下一台计算机之前等待 160 秒...
有人可以用任何方法帮助我但不使用外部工具吗?
您应该阅读有关 delayedexpansion
的 SO 项目。
if %errorlevel%==0 (
第一个脚本应该是
if not errorlevel 1 (
[显然,反转逻辑条件并删除 "not"]
if errorlevel 1
表示 "if errorlevel
is 1 or greater than 1" 并根据 运行-time 值 errorlevel
.[=28= 进行解释]
下一个:
ping -n 1 %subnet%%%G && set pingtest=ok
if '%ping_test%'=='ok' (
应该是
set "ping_test="
ping -n 1 %subnet%%%G && set "ping_test=ok"
if defined ping_test (
注释
您正在 ping
命令中设置 pingtest
,然后您正在尝试测试 ping_test
即使变量名是正确的,if
语句中引号的目的是将内容组合成一个字符串。单引号不切芥末,需要双引号。
根据您的代码,ping_test
设置后将在下一个循环中保留其值,您需要在ping
之前清除。
替换代码首先将ping_test
的值设置为nothing。引号分隔变量名称和值,以便行中的尾随空格 not 包含在分配的值中。然后 ping
命令可以将 ping_test
的值设置为(可以,但是 nothing 以外的任何值(即 something) 已验证)。 if defined
命令解释变量的运行-时间值。
第三部分 - 好吧,变得绝望了,但没有必要走这么远,因为我概述的更改应该可以解决问题。
关于您所说的尝试使用延迟扩展的第一组代码,它应该如下所示。在我的网络上测试并工作。
@echo off
setlocal enabledelayedexpansion
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
ping -n 1 %subnet%%%G | findstr "TTL="
if !errorlevel!==0 (
echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
) else (
echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
)