【问题标题】:Test if computer is available on network测试计算机是否在网络上可用
【发布时间】:2017-10-23 14:20:10
【问题描述】:

我在一家有很多商店的公司工作。每个店铺都有自己的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 等等。

我公司的总部只能在每个商店的第一台计算机上部署软件(许可证问题)。 在这里,我们将尝试在所有商店的所有 windows 计算机上安装 Xerox 驱动程序。

我做了 3 个批处理脚本:

  1. 第一个,作为电脑的超级管理员启动,安装一个具有管理员权限的新用户来安装驱动
  2. 第二个,以新用户身份启动,安装 Xerox 驱动程序并将打印机设置为默认打印机。
  3. 第三个,作为电脑的超级管理员启动,尝试在同店的其他电脑上安装施乐驱动:

    • 循环遍历我的 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 窗口中运行批处理,这里是输出的摘录:

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 ) 
)

似乎我的脚本中的errorlevel总是= 0,IDK为什么。

第二个:

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 exists 文件夹:

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

它可以工作,但如果存在超时时间约为 160 秒,我不想等待 160 秒才能转到下一台计算机...

有人可以用任何方法帮助我,但不使用外部工具吗?

【问题讨论】:

  • 当您在括号内的代码块中时,您需要启用延迟扩展并像这样引用您的变量。示例:%errorlevel% 变为 !errorlevel!
  • 我试过了,但是 IDK 为什么,批处理无法识别 var !errorlevel!即使我setlocal enabledelayedexpansion。感谢您的回答,Magoo 为我找到了解决方案!
  • 如果您在某些时候继续使用批处理文件,您将需要使用延迟扩展。甚至 Magoo 也向您指出了这一点。

标签: windows batch-file for-loop ping


【解决方案1】:

您应该阅读有关 delayedexpansion 的 SO 项目。

if %errorlevel%==0 (

在第一个脚本中应该是

if not errorlevel 1 (

[显然,反转逻辑条件,去掉“不”]

if errorlevel 1 表示“如果 errorlevel 为 1或大于 1”,并根据 errorlevelrun-time 值进行解释。

下一步:

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。引号分隔变量名称和值,以便行上的尾随空格包含在分配的值中。然后ping 命令可以将ping_test 的值设置为(好的,但是除了nothing(即something)之外的任何值都是有效的)。 if defined 命令解释变量的 run-time 值。

第三部分 - 好吧,越来越绝望了,但没有必要走到这一步,因为我概述的更改应该可以解决问题。

【讨论】:

  • 我保留了脚本 1 并使用了 if not errorlevel 1,一切都很好!感谢您的帮助!
【解决方案2】:

关于您说您尝试使用延迟扩展的第一组代码,它应该如下所示。经过测试并在我的网络上运行。

@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
    )

【讨论】:

  • 现在我阅读了您的代码,我很确定我的错误是在 for 循环中的 setlocal EnableDelayedExpansion...
  • @locobastos 你可以把它放在 DO 执行里面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2011-04-05
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多