测试计算机是否可在网络上使用

时间:2017-10-23 14:20:10

标签: windows batch-file for-loop ping

我在一家有很多商店的公司工作。每个商店都有自己的IP地址: SHOP 1 = 192.168.1.0/24,SHOP 2 = 192.168.2.0/24,SHOP 3 = 192.168.3.0/24等......

我在每个商店的同一子网(255.255.255.0)上有许多Windows计算机(1到9之间)。 每台计算机都有一个静态IP地址:1st = 192.168.1.10,2nd = 192.168.1.20,3nd = 192.168.1.30,4th = 192.168.1.40等。

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

我制作了3个批处理脚本:

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

    • 循环访问我的9个IP地址(for /l %%G in (...) do (...)
    • 对于每个IP地址,请测试它是否ping。
    • 在计算机1和IP地址(驱动程序包+脚本)之间进行ftp传输
    • PsExec64.exe运行第一个脚本
    • PsExec64.exe运行第二个脚本
  4. 第一个和第二个脚本完美无缺,我们不会谈论它们。

    我需要帮助的地方是第三个。

    我尝试了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
        )
    )
    

    这里是我子网上有2台计算机的log_ping_errorlevel.txt:

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

    这里是我的子网上有2台计算机的log_ping_set.txt:

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

    这里是我子网上有2台计算机的log_folder_reachable.txt:

    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秒再去下一台计算机......

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

2 个答案:

答案 0 :(得分:1)

您应阅读有关delayedexpansion

的SO项目
if %errorlevel%==0 (
第一个脚本中的

应该是

if not errorlevel 1 (

[显然,扭转逻辑条件并删除“不”]

if errorlevel 1表示“如果errorlevel为1 或大于1 ”,则会在运行时值{{1 }}

下一步:

errorlevel

应该是

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 ( 命令中设置pingtest,然后您正在尝试测试ping

即使变量名是正确的,ping_test语句中引号的目的是将内容组合为单个字符串。单引号不会削减芥末,需要双引号。

使用您拥有的代码,if设置后将保留其下一个循环的值,您需要在ping_test之前清除

替换代码首先将ping的值设置为 nothing 。引号分隔变量名称和值,以便该行上的尾随空格包含在分配的值中。然后,ping_test命令可以将ping的值设置为(ok,但除 nothing 之外的任何值(即某些)都有效)。 ping_test命令解释变量的运行时值。

第三部分 - 好吧,变得绝望,但没有必要走得太远,因为我所概述的变化应该可以解决问题。

答案 1 :(得分:0)

关于你说你尝试使用延迟扩展的第一组代码,它应该是这样的。经过测试并在我的网络上运行。

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