从批处理

时间:2016-06-01 03:59:27

标签: batch-file cmd set

我正在尝试编写一个工作脚本,告诉我网络上的哪些机器在线以及哪些机器处于脱机状态。

目前我让它显示在线/离线状态,将文本文件中的PC名称作为输入转换为设置变量。

我到目前为止的代码是:

@echo off
setlocal EnableDelayedExpansion

for /F "tokens=*" %%a in (VC.txt) do call :append %%a

:ping
for %%i in (%VC) do (
 ping %%1 -n 1 >nul
 call :test %%i
)
echo.
goto :ping

:test
IF %ERRORLEVEL% EQU 0 (
 echo Pinging %1
) else (
 echo Off %1
)
goto :eof

:append
if defined VC (
 set VC=%VC% %1
) else (
 set VC=%1
)

我想要发生的是一旦机器上线,将其从列表中删除。基本上只显示离线机器的列表。 这可能不擦拭整套并创造它新鲜吗?

1 个答案:

答案 0 :(得分:0)

这个mod做你想要的:

:test
IF %ERRORLEVEL% EQU 0 (
 echo Pinging %1
 REM Remove this machine from the list
 set "VC=!VC: %1=!"
) else (
 echo Off %1
)
goto :eof

但是,您的代码中有一些小错误。这是固定的部分:

:ping
for %%i in (%VC%) do (
 ping %%i -n 1 >nul
 call :test %%i
)
echo.
goto :ping

与您的问题无关的几点。如果机器名称是没有空格的单个单词,则不需要"tokens=*"命令中的for部分。而且,所有这些call和子例程只会使代码复杂化。这就是我这样做的方式:

@echo off
setlocal EnableDelayedExpansion

set "VC="
for /F %%a in (VC.txt) do set "VC=!VC! %%a"

:ping
for %%i in (%VC%) do (
   ping %%i -n 1 >nul
   IF !ERRORLEVEL! EQU 0 (
      echo Pinging %%i
      REM Remove this machine from the list
      set "VC=!VC: %%i=!"
   ) else (
      echo Off %%i
   )
)
echo/
if defined VC goto :ping

echo All machines are on line