Script zum Herunterfahren von Windows-Rechnern…

Wer kennt es nicht? Der Rechner seiner Schwester / seines Bruders läuft, und die entsprechende Person liegt im Bett und ratzt gemütlich. Die Eltern bitten einen dann, den Rechner herunterzufahren.

Nun hat man zwei Möglichkeiten: Entweder sich vor den anderen Rechner zu setzen und ihn herunterzufahren, oder dies gleich über das Netzwerk zu tun (wenn man denn Benutzernamen und Passwort hat). Da Informatiker ja doch faul sind, werden sich die meisten für die zweite Methode entscheiden. Also an den Rechner anmelden und Shutdown  senden. Dazu sind meines Wissens nach mind. 2 Befehle notwendig. Okay, nicht viel, aber nicht immer hat man diese im Kopf, oder man will sich ganz einfach Tipp-Arbeit sparen…

Also hab ich mir gedacht, baust du dir schnell ein Script, welches dir ermöglicht entweder den lokalen oder einen anderen Rechner im Netzwerk herunterzufahren. Solange der Netzwerkrechner noch läuft, soll dies angezeigt werden, ebenfalls, wenn er endlich heruntergefahren ist.  Als schneller Aufbau ist dieses Script (shutd.cmd) entstanden:

@echo off
cls
if "%1" == "" goto help

if "%1" == "local" goto local

ping %1 >NUL
if errorlevel 1 (cls && echo %1 ist offline && goto abort)
cls
echo %1 ist online
ping localhost -n 3 -w 1000 >NUL
cls

:benutzername
echo Bitte Benutzernamen eingeben:
set /p benutzername=
cls
if "%benutzername%" == "" goto benutzername

:passwort
echo Bitte Passwort eingeben (Achtung: Niemanden ber die Schulter schauen lassen!):
set /p passwort=
cls
if "%passwort%" == "" goto passwort

net use \%1ipc$ "%passwort%" /USER:"%benutzername%"
if errorlevel 1 (echo Es konnte keine Verbindung zum Host hergestellt werden... && goto abort)
cls
echo Verbindung erfolgreich hergestellt
ping localhost -n 3 -w 1000 >NUL

shutdown -t 30 -m \%1 -s
if errorlevel 1 (cls && echo Beim Versuch, den Rechner herunterzufahren, ist ein Fehler aufgetreten... && goto abort)
cls
echo Erfolgreicher Versuch, den Rechner herunterzufahren
ping localhost -n 3 -w 1000 >NUL
goto test

:local
shutdown -t 30 -s
goto exit

:help
echo USAGE:
echo --------------------------------------------------------------------------------
echo Diese kleine Batch-Datei wurde geschrieben um bequem einen Rechner herunterzu-
echo fahren. Dies kann entweder der lokale PC oder ein Rechner im Netzwerk sein.
echo.
echo Um den eigenen PC herunterzufahren, tippe folgendes ein:
echo shutd local
echo Dies f„hrt den Rechner, vor dem du (hoffentlich) gerade sitzt, herunter.
echo.
echo.
echo Um einen PC ber das Netzwerk herunterzufahren, gebe folgendes ein:
echo shutd [Hostname / IP-Adresse]
echo.
echo Damit ein PC ber das Netzwerk heruntergefahren werden kann, wird ein gltiges
echo Benutzerkonto mit Passwort und den entsprechenden Rechten ben”tigt. Es wird
echo zun„chst geprft, ob der Rechner ber das Netzwerk erreichbar ist (Ping), und
echo sollte dies der Fall sein, wirst du aufgefordert, einen Benutzernamen und das
echo dazugeh”rige Passwort einzugeben. Stimmt das Passwort nicht oder existiert der
echo Benutzer auf dem Zielrechner nicht, wird der Vorgang abgebrochen. Sollte alles
echo in Ordnung sein, so wird der Rechner anschlieáend (hoffentlich erfolgreich)
echo heruntergefahren. Zum Test kann ein Dauer-Ping ausgefhrt werden, um die
echo Erreichbarkeit des Rechners zu prfen.
pause
goto :eof

:test
cls
set benutzername=
set passwort=
set test=default
echo Soll ein Dauer-Ping auf den Zielrechner zum šberprfen des Status ausgefhrt werden? [J/N]
set /p test=
if /I "%test%" == "J" goto ping
if /I "%test%" == "N" goto exit
goto test

:ping
set test=
ping localhost -n 3 -w 1000 >NUL
cls
ping %1 -n 1 -w 1000 >NUL
if errorlevel 1 (cls && echo %1 scheint offline zu gehen && goto ping2)
cls
echo %1 ist noch online
goto ping

:ping2
ping localhost -n 3 -w 1000 >NUL
cls
ping %1 -n 1 -w 1000 >NUL
if errorlevel 1 (cls && echo %1 scheint offline zu sein && goto ping3)
cls
echo %1 ist noch online
goto ping

:ping3
ping localhost -n 3 -w 1000 >NUL
cls
ping %1 -n 1 -w 1000 >NUL
if errorlevel 1 (cls && echo %1 ist mit sehr hoher Wahrscheinlichkeit offline && goto exit)
cls
echo %1 ist noch online
goto ping

:abort
set benutzername=
set passwort=

:exit
echo.

Das Script ist mit Sicherheit noch nicht optimal, die Umlaute werden hier noch nicht korrekt angezeigt (in der Commandline sollte dies hoffentlich passen), einiges ist doppelt und könnte besser in Call-Subroutines ausgelagert werden, außerdem bin ich dem Ziel noch nicht ganz entgegengekommen, dass die Pings auf den Netzwerkrechner nicht angezeigt, aber dennoch ausgewertet werden. Ansonsten tut es aber von der Grundfunktionalität für mich genau das, was es soll (kurz an einer VM getestet).

Bugs, Verbesserungsvorschläge, Anregungen, Kritik, Lob & Dank sind willkommen, ob sie Ernst genommen werden ist eine andere Frage 😛