simon-mcp
Goto Top

Ping- Batch-Script um PCs aufzuwecken

Grundlegendes über aus- und einlesen einer Textdatei

Hallo,

Ich habe folgendes Problem:
Ich will mehrere PCs in der Nacht per WakeOnLan starten um einen Virenscanner laufen zu lassen. Nach ca. 2h sollen die PCs wieder per shutdown befehl heruntergefahren werden.

Doch nun zum dem aus meiner Sicht schwierigsten Punkt:
Nach den 2h sollen nur die PCs ausgeschaltet werden, die vorher auch schon ausgeschaltet waren. Das heißt Rechner die schon an waren, sollen an bleiben und nicht heruntergefahren werden.

Meine Überlegungen:
[Feststellen welche Rechner an sind]
irgendwie mit dem ping befehl und dann das Ergebnis jeweils in eine Textdatei schreiben und die später wieder auslesen um zu wissen, welche Rechner wieder heruntergefahren werden müssen.
Doch leider habe ich keine Idee wie ich das realisieren kann.

[Rechner starten]
per WakeOnLan mit dem Tool mc-wol.exe

[Rechner herunterfahren]
per shutdown.exe

Habt ihr vielleicht ein paar Ideen für mich, wie ich das am besten umsetzen kann ?

Content-Key: 60556

Url: https://administrator.de/contentid/60556

Printed on: April 26, 2024 at 22:04 o'clock

Member: IchoTolot2
IchoTolot2 Jun 04, 2007 at 17:43:59 (UTC)
Goto Top
Eine Möglichkeit wäre auch über einen Umweg zu arbeiten:

Bei allen Rechnern ein Script in den Autostart legen das den Rechnernamen in eine zentrale Datei schreibt.

Diese Datei vor dem Starten der Rechner mit WOL leeren.

Nach 2 h jede Zeile der Datei an den Shutdown durchreichen.


So mal meine Idee zu dem Thema

LG
Ingo
Member: Simon-MCP
Simon-MCP Jun 04, 2007 at 18:43:48 (UTC)
Goto Top
Hallo Icho Tolot,

vielen Dank erstmal für deinen Beitrag.
Dies ist leider keine Lösung für mich. Das ganz soll Zentral (z.B. von einem Server) verwaltet werden können. Ohne jeden Rechner anfassen zu müssen.

Es würde mir auch schon sehr viel weiterhelfen, wenn mir jemand sagen könnte,
wie man eine Textdatei richtig ausliest.

Beispiel Textdatei:

IPs.txt ----
192.168.2.3
192.168.2.4
192.168.2.5
192.168.2.6
...

Ich möchte die Werte nacheinander auslesen und dann nach und nach abarbeiten.

@Mein bisheriger Code:
for /f "Token=*" %%i in (IPs.txt) set var=%%i
ping %var% | find "TTL" >output.txt

Doch leider weise ich so der Variable "var" immer nur den letzten Wert... und nicht alle Werte nach einander zu... was muss ich ändern ?
Member: Biber
Biber Jun 04, 2007 at 19:10:48 (UTC)
Goto Top
Moin crus-online#de,

willkommen im Forum.

Zu den FOR /F-Anweisungen findest Du hier im Forum eine Menge Beispiele.

Im Prinzip kannst Du das als Batch-Newbie stur nach folgendem Schema machen (und pflegen):
<b>FOR /F </b> %%i in (Dein.txt) <b>DO call :ProcessALine</b> %%i
<b>goto :eof</b>
~~~~~~~Hier ist die Abarbeitung der Textdatei und auch der Batch zu Ende~~

<b>:ProcessALine</b> Parameter1( also %1)  ist das erste Token der Zeile
REM MachWasMit %1 ...   
<b>goto :eof</b>
In Deinem Fall:
@echo off & setlocal
...
Echo MalNeFastLeereDateiAnlegen> %temp%\TheseWereAlive.txt
FOR /F "tokens=1" %%i in (IPs.txt) DO call :PingAlleAb %%i  
FOR /F "tokens=1,2" %%i in (IPs.txt) DO call :WeckAlleAuf %%i %%j  
goto :eof
~~~~~~~Hier ist die Abarbeitung der Textdatei und auch der Batch zu Ende~~

:PingAlleAb Parameter1( also %1)  ist das erste Token der Zeile
REM MachWasMit %1 ...     in Deinem Fall:
Ping %1 |find "TTL" >nul && echo %1>>%temp%\TheseWereAlive.txt  
goto :eof
~~~
:WeckalleAuf Param1 ist die IP, Param2 die MAC-Adresse 
::.... Alternativ: MAC-Adresse aus IP-Ermitteln (z.B mit GetMac.exe oder mcGetMac.exe
:: ... oder aus seperater Liste/Textdatei ....
::....  oder eben aus der IPs.txt (kann ja das zweite Token sein) ....

Find "%1" "%temp%\TheseWereAlive.txt" || mc-wol %2 /i %1   
:: Alle IPs, die noch nicht wach waren, aufwecken
......(Start Virenscanner....)
Find "%1" "%temp%\TheseWereAlive.txt" || Shutdown.....  
:: Alle IPs, die nicht wach waren, schlafen legen

So in etwa die ungetestete Skizze.

Ach ja, die IPs.txt würde ich so erweitern:
---- IPs.txt ----
192.168.2.3, 00-11-20-3E-C1-C9
192.168.2.4, 00-12-21-3E-C2-C8
192.168.2.5, 00-13-22-3E-C3-C7
192.168.2.6, 00-14-23-3E-C4-C6
...
Gruss
Biber
[Edit] @geTuemII
Welchen sittlichen Nährwert hat denn dann das Setzen der Variablen %var% für diese flüchtige Sekunde?
Dann reicht doch:
for /f "Token=1" %%i in (IPs.txt) do ping %%i |find "TTL" >> output.txt  
...ach, Frauen.... face-wink
Aber schön, Dich zu lesen...
[/Edit]
Member: geTuemII
geTuemII Jun 04, 2007 at 19:19:04 (UTC)
Goto Top
Du meinst, in der output.txt steht immer nur der letzte Wert?

for /f "Token=*" %%i in (IPs.txt) do (  
set var=%%i
ping %var% |find "TTL" >> output.txt)  
Nicht getestet.
[Edit] Ups, Der Meister [tm] war schneller, nimm also das.[/Edit]

geTuemII
Member: Simon-MCP
Simon-MCP Jun 05, 2007 at 08:57:29 (UTC)
Goto Top
Hallo Biber,

vielen, vielen Dank erst mal für deine sehr ausführlich Hilfe.

Ein kleines Problem habe ich mit dem Script allerdings noch:
An dem Punkt "Alle PCs aufwecken", weckt er leider nicht alle auf. Er weckt einen von den xx PCs auf und dann springt er sofort in die Virenscanner Routine und danach in die Shutdown Routine. Erst dann wird der nächste PC aus der Liste aufgeweckt.

Kann man dies auch so realisieren, dass er erst ALLE PCs einschaltet und dann weiter geht ?

Aktuell sieht der Code folgendermaßen aus:
@echo off & setlocal
Echo MalNeFastLeereDateiAnlegen> %temp%\TheseWereAlive.txt
FOR /F "tokens=1" %%i in (C:\aufwecken\IPs.txt) DO call :PingAlleAb %%i  
FOR /F "tokens=1,2" %%i in (C:\aufwecken\IPs.txt) DO call :WeckAlleAuf %%i %%j  
goto :eof

:PingAlleAb Parameter1( also %1)  ist das erste Token der Zeile
REM MachWasMit %1 ...     in Deinem Fall:
Ping %1 |find "TTL" >nul && echo %1>>%temp%\TheseWereAlive.txt  
goto :eof

:WeckalleAuf Param1 ist die IP, Param2 die MAC-Adresse 
Find "%1" "%temp%\TheseWereAlive.txt" || C:\aufwecken\mc-wol.exe %2 /i %1   
:: Alle IPs, die noch nicht wach waren, aufwecken

Echo (Start Virenscanner....)
C:\aufwecken\Sleep 7200

Find "%1" "%temp%\TheseWereAlive.txt" || C:\Windows\System32\shutdown.exe -s -f -m \\%1  
:: Alle IPs, die nicht wach waren, schlafen legen

An der Stelle:
Echo (Start Virenscanner...)
C:\aufwecken\SLEEP.exe 7200


Halte ich das Script für 2h an, dass der Virenscanner genug Zeit hat, einen Fullscan durchzuführen.
Dadurch wird der Start des nächsten PCs natürlich um 2h verzögert. Dies ist leider etwas schlecht, da es sich um mehrere Rechner handelt und eine Nacht dann nicht ausreichen würde.

Kann man durch einen Befehl erreichen, dass er erst zur nächsten Routine geht, nachdem alle Rechner (die nicht eingeschaltet waren) aufgeweckt wurden?
Member: geTuemII
geTuemII Jun 05, 2007 at 10:52:57 (UTC)
Goto Top
Wo sehe ich denn eigentlich den Startaufruf des Virenscanners? Kannst du das über CALL auf ein anderes Batch machen? IMHO wartet das aufrufende Batch nämlich in neueren BS nicht mehr, bis das Sub abgearbeitet worden ist.

@Biber: %var% kann nur wegen Nutzlosigkeit nicht einfach so in diesem Script gekündigt werden, sonst gibt es Ärger mit dem Gleichstellungsbeauftragten. Ist schließlich ein Mädchen.

geTuemII
Member: Simon-MCP
Simon-MCP Jun 05, 2007 at 11:19:38 (UTC)
Goto Top
Hallo geTuemII,

den Aufruf vom Virenscanner werde ich über eine Management Console von Symantec steuern.
Die Rechner müssen dazu nur eingeschaltet sein. --> Rest wird über die Konsole erledigt. (ausser das Herunterfahren :D)

Das Script von Biber funktioniert echt einwandfrei. Habe gerade nur einen Rechner in der Textdatei angegeben und dieser wird sauber gestartet wartet meine Pause ab und wenn er eingeschaltet war wird er angelassen und wenn er aus war wird er heruntergefahren.

Einzigstes Problem:
Sobald ich 2 Rechner in die Textdatei eintrage, dann arbeitet er die PCs nacheinander ab anstatt Sie alle erst hoch zu fahren und dann am Schluss wieder alle runter zu fahren.


Vielen Dank für Eure bisherigen Bemühungen.
Member: Biber
Biber Jun 05, 2007 at 18:19:43 (UTC)
Goto Top
Moin crus-online,

Kann man durch einen Befehl erreichen, dass er erst zur nächsten Routine geht, nachdem alle Rechner (die nicht eingeschaltet waren) aufgeweckt wurden?

Bau dafür einfach drei FOR /F Anweisungen und drei geCALLte Blöcke nacheinander auf.

Runde 1) FOR/F ...[Wie oben].....DO Call:PingAlleAb %%i
Runde 2) FOR/F ...[Wie oben].....DO Call:WeckAlleAuf %%i %%j
Runde 3) FOR/F ...[Wie oben].....DO Call:StartAVTool %%i

wobei sich :WeckalleAuf verkürzt auf:
goto :eof

Und was Du bei :StartAVTool machst, hängt davon ab, ob Du alle Clients scannen willst mit der Rechnerleistung Deines Servers oder ob die jeweils "selbst" eine Anwendung starten sollen.
Der erste Fall (Server scannt alle Clients) wäre dann:
:StartAVTool
START AvTool.exe [AVTool-Parameterliste] [Ip-Adresse==%1+Lw-Angabe]
goto :eof

Nach diesen drei FOR-Anweisungen kannst Du dann eine Zeile mit "sleep 7200" einfügen.
Als Letztes dann...
Runde 4) FOR /F ...[Wie oben]... Do CALL :LegAlleSchlafen %%i
:LegAlleSchlafen
Find "%1" "%temp%\TheseWereAlive.txt" || C:\Windows\System32\shutdown.exe -s -f -m \\%1  
:: Alle IPs, die nicht wach waren, schlafen legen
goto :eof

Thats all.
 Einzigstes Problem:
Du meintest sicher: "Einziges Problem:"? face-wink

HTH Biber
P.S. @geTuemII
...mit dem/der Gleichstellungsbeauftragten... face-big-smile
Liebe Grüße an alle Variablen und Platzhalterinnen
Member: Simon-MCP
Simon-MCP Jun 11, 2007 at 06:34:45 (UTC)
Goto Top
Hallo Biber,

vielen, vielen Dank für deine Super Hilfe.
Das Script läuft soweit echt Super. Ich habe noch ein paar kleinere Probleme, aber ich denke das ich diese auch noch in den Griff bekommen werde.

*5 Sterne für dich ;-D*

@Mein komplettes Script lautet nun:
@echo off & setlocal
::Temporäre Datei anlegen
Echo TempDatei> %temp%\TheseWereAlive.txt

FOR /F "tokens=1" %%i in (C:\aufwecken\IPs.txt) DO call :PingAlleAb %%i  
FOR /F "tokens=1,2" %%i in (C:\aufwecken\IPs.txt) DO call :WeckAlleAuf %%i %%j  

Echo (Start des Virenscanner)
::Pause von 2h damit der Virenscanner durchlaufen kann
C:\aufwecken\SLEEP.EXE 120

FOR /F "tokens=1,2" %%i in (C:\aufwecken\IPs.txt) DO call :LegAlleSchlafen %%i  
goto :eof

:PingAlleAb
Echo (Ueberpruefen, welche Rechner schon eingeschaltet sind)
Ping %1 |find "TTL" >nul && echo %1>>%temp%\TheseWereAlive.txt  
goto :eof

:WeckalleAuf (Param1 ist die IP, Param2 die MAC-Adresse)
Echo (Rechner die nicht eingeschaltet waren, jetzt einschalten)
Find "%1" "%temp%\TheseWereAlive.txt" || C:\aufwecken\mc-wol.exe %2 /i %1   
:: Alle IPs, die noch nicht wach waren, aufwecken
goto :eof

:LegAlleSchlafen
Echo (Rechner die nicht eingeschaltet waren, wieder herunterfahren)
Find "%1" "%temp%\TheseWereAlive.txt" || C:\Windows\System32\shutdown.exe -s -f -m \\%1  
:: Alle IPs, die nicht wach waren, schlafen legen
goto :eof

cu
Crus