2016-06-01 7 views
0

Ich versuche, ein Skript für die Arbeit zu schreiben, die mir sagt, welche Maschinen in einem Netzwerk online und welche offline sind.Entfernen von Werten aus Satz im Batch

Momentan habe ich es online/offline Status zeigen, die PC-Namen aus einer Textdatei als Eingabe in eine Set-Variable.

Der Code, den ich bisher habe, ist:

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

Was will ich einmal geschehen ist ein Gerät online geht, ist es aus der Liste zu entfernen. Im Grunde nur zeigen Sie nur die Liste der Offline-Maschinen. Ist das möglich, ohne das ganze Set zu wischen und frisch zu machen?

+0

Design Frage: nur weil eine Maschine online kam bedeutet nicht, dass es online bleiben wird. Helfen Sie mir zu verstehen, warum Sie nicht die gesamte Maschinenliste erneut durchsuchen müssen, unabhängig davon, welches Abfrageintervall Sie haben? Zusätzlicher Gedanke: Müssen Sie "Geschichte" Statistiken behalten? z.B. durchschnittliche Betriebszeit für eine bestimmte Maschine, Gesamtausfallzeit für Maschinen. Dies in einer "Batch" -Datei zu tun scheint suboptimal, aber Sie haben wahrscheinlich einen guten Grund dafür. Wie auch immer, tut mir leid, ich kann dir bei deiner genauen Frage nicht helfen. * Achselzucken * viel Glück. – jgreve

+0

Es gibt zwei Tippfehler: 'für %% i in (% VC) do 'sollte' für %% i in (% VC%) do 'lesen (fehlendes'% 'Zeichen), und' ping %% 1 -n 1 'sollte lesen: 'ping %% i -n 1' ... – aschipfl

+0

@jgeve, Die Liste wird ständig neu gescannt, um sicherzustellen, dass die Maschinen online bleiben. Und nein, ich brauche keine Geschichte. Grundsätzlich muss ich eine Datei auf eine Maschine kopieren, sobald sie online ist, damit ich sie verfolgen kann. –

Antwort

0

Dieser Mod zu tun, was Sie wollen:

: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 

Sie jedoch ein paar kleine Fehler in Ihrem Code haben. Dies ist der feste Abschnitt:

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

Ein paar Punkte, die nichts mit Ihrem Problem zu tun haben. Wenn die Computernamen einzelne Wörter ohne Leerzeichen sind, wird der "tokens=*" Teil im Befehl for nicht benötigt. Auch all diese call 's und Subroutinen erschweren nur den Code. Dies ist die Art und Weise, wie ich dies tun würde:

@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

Das ist genau das, was ich brauchte. Tausend Dank. –

Verwandte Themen