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 ?
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 ?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 60556
Url: https://administrator.de/contentid/60556
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
9 Kommentare
Neuester Kommentar
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
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
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):
In Deinem Fall:
So in etwa die ungetestete Skizze.
Ach ja, die IPs.txt würde ich so erweitern:
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:
...ach, Frauen....
Aber schön, Dich zu lesen...
[/Edit]
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>
@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
...
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
Aber schön, Dich zu lesen...
[/Edit]
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
@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
Moin crus-online,
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
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:
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:
HTH Biber
P.S. @geTuemII
...mit dem/der Gleichstellungsbeauftragten...
Liebe Grüße an alle Variablen und Platzhalterinnen