我正在尝试编写一个工作脚本,告诉我网络上的哪些机器在线以及哪些机器处于脱机状态。
目前我让它显示在线/离线状态,将文本文件中的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
)
我想要发生的是一旦机器上线,将其从列表中删除。基本上只显示离线机器的列表。 这可能不擦拭整套并创造它新鲜吗?
答案 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