2016-06-01 84 views
0

我正在尝试编写一个工作脚本,告诉我网络上的哪些计算机处于联机状态,哪些计算机处于脱机状态。从批处理中删除值

目前我有它显示在线/离线状态,从一个文本文件的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

设计问题:只是因为机器上线并不意味着它会保持在线状态。帮助我理解为什么您不需要在任何轮询间隔时间内重新扫描整个机器列表?补充想法:你需要保留“历史”统计数据吗?例如给定机器的平均正常运行时间,机器的总停机时间。在“批处理”文件中这样做似乎是次优的,但你可能有一个很好的理由。无论如何,对不起,我无法帮助你确切的问题。 *耸耸肩*祝你好运。 – jgreve

+0

有两个拼写错误:'for %% i in(%VC)do' should read for for %% i in in(%VC%)do'(missing'%'sign),'ping %% 1 -n 1 '应该读'ping %% i -n 1' ... – aschipfl

+0

@jgeve,该列表不断被重新扫描以确保机器保持在线状态。不,我不需要任何历史。基本上我需要将文件复制到一台机器上,这样可以帮助我跟踪它们。 –

回答

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 

一些问题与您的问题无关。如果机器名称是单个单词且没有空格,则不需要for命令中的"tokens=*"部分。而且,所有这些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 
+0

这正是我需要的。感谢堆。 –