larz
Goto Top

Vorbereiten eines Schulungsraumes mittels Batch Dateien

Will man einen Schulungsraum vorbereiten, der mit 10 - 20 PCs ausgestattet ist, kann es durchaus nervig werden, wenn man jeden einzelnen von Hand starten, benötigte Dateien kopieren und danach herunterfahren muss. Ebenso ist es, wenn man nach einer Schulung kleinere Übungs-Dateien o.ä. wieder von jedem einzelnen Rechner löschen muss.
Für diese Zwecke sind nachfolgende Batch-Files gedacht.

Anforderungen:
- Auch der evtl. (PC-)fremde Referent einer Schulung soll damit umgehen können
- es sollen möglichst nur Bordmittel verwendet werden

Voraussetzungen:
- Die Rechner und Netzwerkkarten müssen Wake-On-Lan können.
- das Programm wol.exe (zur Steuerung Wake-On-Lan)
- auf allen Schulungsrechnern existiert das Verzeichnis C:\Schulungsdaten
- Alle unten genannten Dateien sind im selben Verzeichnis, hier: C:\Schulungsraum

Bestandteile
Allgemeine Files:
- Allgemeine_Einstellungen.bat --> Hier werden z.B. Variablen für Umlaute und die Farben bestimmt
- Computernamen_Schulungsraum.txt --> eine Liste in der die Namen aller Schulungsrechner aufgeführt ist
- Mac-Adressen_Schulungsraum.txt --> wie oben, nur eben mit allen Mac-Adressen
- variablen.ini --> da mehrere Batch-Dateien die selben Variablen brauchen, hab ich mir die einfach in eine zentrale Datei geschrieben
- wol.exe --> Zum "aufwecken" der PCs (muss heruntergeladen werden)

Die "Anwendungen":
- Schulungsrechner_Erreichbarkeit_pruefen.bat --> Pingt die Rechner nacheinander an und zeigt dies dem Benutzer an
- Schulungsrechner_herunterfahren.bat --> Klar, um die Rechner alle nach der Schulung wieder herunterzufahren (falls es doch mal einer nicht gemacht hat face-wink)
- Schulungsrechner_starten.bat --> das Gegenstück zu oben - alle gleichzeitig starten
- Schulungsrechner_Daten_kopieren.bat


So, jetzt aber zum Quelltext:

Allgemeine_Einstellungen.bat
REM Hier werden Variablen für die Umlaute definiert, damit Sie nachher im Text richtig angezeigt werden (ANSI/ASCI-Problem)
chcp 1252>nul
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß
chcp 850>nul

REM Hier wird die Farbe der Fenster bestimmt
COLOR 0E

REM Und nun noch vor dem jeweiligen  "Programmstart" sauber putzen...  
CLS


Variablen.ini
Hier stehen wirklich nur die Variablen drin, also alles was nach dem set-Befehl kommt.
Hier dürfen auch keine REMs oder ECHOs drin sein, weil jede Zeile in einer Schleife aufgerufen wird
Computernamen=C:\Schulungsraum\Computernamen_Schulungsraum.txt
Mac-Adressen=C:\Schulungsraum\Mac-Adressen_Schulungsraum.txt
DatenFuerSchueler=C:\Schulungsraum\Daten_fuer_Schueler
WOL=C:\Schulungsraum\woL.exe


Computernamen_Schulungsraum.txt
PCName1
PCName2
PCName3
PCName4


Mac-Adressen_Schulungsraum.txt
Hier unbedingt darauf achten dass die Adressen ohne Trennzeichen sind

001E37411234
001E37411234
001E37411234
001E37411234


Schulungsraum_Erreichbarkeit_pruefen.bat
@ECHO OFF & SETLOCAL
REM hier erfolgt erstmal die Verarbeitung der allgemeinen Einstellungen 
call C:\Schulungsraum\Allgemeine_Einstellungen.bat

REM Variablen einlesen
for /f %%i in (C:\Schulungsraum\variablen.ini) do set %%i

:DoAction
REM Jetzt geht's los - für jeden Eintrag in der Liste der Computernamen ...  
for /f %%i in (%Computernamen%) do (
cls
@echo -------------------------------------------------------------------
@echo Computer werden angepingt...
@echo -------------------------------------------------------------------
REM ...wird der jeweilige PC genau einmal angepingt und 50 ms auf eine Antwort gewartet
ping %%i -n 1 -w 50
@echo -------------------------------------------------------------------
@echo                       Abbruch mit Strg + C
@echo -------------------------------------------------------------------
REM Der nachfolgende Ping auf localhost bewirkt lediglich, dass die Antwort des Rechners noch eine Weile stehen bleibt 
ping localhost -n 2 >nul
)
@echo off 
REM Und hiermit geht's zurück zum Anfang...  
goto DoAction


Schulungsrechner_herunterfahren.bat
REM Hiermit werden die Schulungsrechner heruntergefahren

@ECHO OFF & SETLOCAL 
REM hier erfolgt wieder zunächst die Verarbeitung der allgemeinen Einstellungen 
call C:\Schulungsraum\Allgemeine_Einstellungen.bat

REM Variablen einlesen
for /f %%i in (C:\Schulungsraum\variablen.ini) do set %%i

:DoAction
@echo.
@echo ---------------------------------------------------------
@echo Hierdurch werden alle Schulungsrechner heruntergefahren 
@echo und ausgeschaltet.
@echo ---------------------------------------------------------
REM ZUr Sicherheit nochmal eine Nachfrage, ob man wirklich alle PCs herunterfahren will
@echo M%oe%chten Sie ALLE Schulungsrechner herunterfahren?
set /p JaOderNein=Ungesicherte Daten k%oe%nnen verloren gehen (J/N):
if /i '%JaOderNein:~0,1%' == 'j' goto :Shutdown  
REM Wird nein (bzw. nicht ja) eingegeben, wird die Verarbeitung der Batch abgebrochen
@echo ---------------------------------------------------------
@echo  Schulungsrechner werden nicht heruntergefahren, beende
@echo ---------------------------------------------------------
REM Und wieder zum Lesen das Fenster ein bischen offen gelassen
ping localhost -n 3 >nul
exit

:Shutdown
@echo.
@echo ---------------------------------------------------------
@echo        Schulungsrechner werden heruntergefahren
@echo ---------------------------------------------------------
echo on
REM Wird "Ja" gewählt, wird der Rechner mit einem entsprechenden Hinweis an den davor Sitzenden heruntergefahren  
for /f %%i in (%Computernamen%) do shutdown -s -t 30 -c "Der Computer wird vom Seminarleiter heruntergefahren" -f -m \\%%i  
ping localhost -n 3 >nul


Schulungsrechner_starten.bat
REM Hiermit werden die Schulungsrechner gestartet

@ECHO OFF & SETLOCAL 
REM Und wieder... 
call C:\Schulungsraum\Allgemeine_Einstellungen.bat

REM Variablen einlesen
for /f %%i in (C:\Schulungsraum\variablen.ini) do set %%i

:DoAction
@echo ----------------------------------------------------------------
@echo               Schulungsrechner werden gestartet
@echo ----------------------------------------------------------------
REM Hier wird in einer Schleife jede Mac-Adresse aus der Datei Mac-Adressen_Schulungsraum.txt ausgelesen und der Rechner mit Wake-on-LAN gestartet
for /f %%i in (%Mac-Adressen%) do %wol% %%i
@echo.
@echo ----------------------------------------------------------------
@echo                  Startbefehl wurden gesendet
@echo ----------------------------------------------------------------
REM Und wieder zur besseren Lesbarkeit:
ping localhost >nul

zu guter letzt

Schulungsrechnern_Daten_kopieren.bat
Wir wollen ja auch Daten für die Schüler bereitstellen. Dafür gibt es einen speziellen Ordner in den der Referent seine Dateien legt und diese dann mit folgender Batch aus alle Schulungsrechner kopiert. Ich gehe hier von kleineren Übungsdateien für Excel oder Word aus, nicht von komplexen Installationsdateien die an spezielle Stellen geschoben werden müssen:
@ECHO OFF & SETLOCAL 
REM Und auch hier zum Schluss nochmal die allgemeinen Einstelungen laden:
call C:\Schulungsraum\Allgemeine_Einstellungen.bat

REM Variablen einlesen
for /f %%i in (C:\Schulungsraum\variablen.ini) do set %%i

:DoAction
@echo -----------------------------------------------------------------
@echo Hiermit werden Alle Dateien aus dem Verzeichnis 
@echo %DatenFuerSchueler% 
@echo auf die Schulungsrechner kopiert. Eventuell vorhandene Dateien
@echo werden dabei %ue%berschrieben
@echo -----------------------------------------------------------------
@echo.

REM Man kann mit diesem Script die Schüler-Verzeichnisse auch gleich wieder sauber machen, deshalb hier die Abfrage, ob kopiert oder gelöscht werden soll
set /p WasWillstDuTun=M%oe%chten Sie neue Dateien (k)opieren oder alte Daten (l)%oe%schen?
if '%WasWillstDuTun%' == 'k' goto Kopieren  
if '%WasWillstDuTun%' == 'l' goto Loeschen  
exit

:Kopieren
@echo -----------------------------------------------------------------
@echo Daten von %DatenFuerSchueler% werden kopiert
@echo -----------------------------------------------------------------
REM Beim Kopieren wird eine Schleife ausgeführt die auf jeden in der Datei Computernamen_Schulungsraum.txt stehenden Rechner Die Dateien vom Referenten-PC kopiert
for /f %%i in (%Computernamen%) do xcopy "%DatenFuerSchueler%\*.*" "\\%%i\c$\Schulungsdaten\" /y  
@echo -----------------------------------------------------------------
@echo Daten wurden auf alle eingeschalteten Schulungsrechner kopiert
@echo -----------------------------------------------------------------
pause
exit

:Loeschen
@echo -----------------------------------------------------------------
@echo Daten der Schulungsrechner werden gel%oe%scht
@echo -----------------------------------------------------------------
REM Beim löschen wird die Schleife auf jedem in der Datei stehendem PC die Dateien im Verzeichnis löschen
for /f %%i in (%Computernamen%) do del \\%%i\c$\Schulungsdaten\*.* /s /q
@echo -----------------------------------------------------------------
@echo Daten wurden auf alle eingeschalteten Schulungsrechnern gel%oe%scht
@echo -----------------------------------------------------------------
ping localhost -n 5 >nul
exit


So, das war einiges in vielen Dateien und mit vielen Variablen. Ich hoffe es ist dennoch ausreichend erklärt und hilft vielleicht (auch nur in Auszügen) dem einen oder anderen mal was.

Gruß
Larz

Content-Key: 127539

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

Printed on: April 16, 2024 at 19:04 o'clock

Member: ITIL-Harry
ITIL-Harry Oct 22, 2009 at 13:06:45 (UTC)
Goto Top
Batches soweit klar, ich würde das aber anders triggern, da ich denke, dass eine lokale Ausführung immer besser ist als eine Übertragung übers Netzwerk

Ich würde die Dateien lokal auf jedem Computer ablegen, die beim Start von einer Batch aufgerufen werden. Die Batch als Startskript führt die Aktionen
nur dann durch, wenn eine Flagdatei vorhanden ist. Das Startskript löscht die Flagdatei am Ende der Durchführung.

Die Flagdatei kopiert man nach Aufwecken des (der) PC(s) auf den C$-Share, auf den man ja übers Netz als Admin zugreifen kann.
Das Verteilen der Flagdatei kann ja noch mit einer Batch am Adminplatz automatisieren.

Wenn jetzt der Schulungsteilnehmer den Rechner einschaltet wird erstmal bereinigt, wenn die Flagdatei vorhanden ist. ansonsten wird die
das Startskript zwar aufgerufen, führt aber keine Aktionen durch.

Gruß
ITIL-Harry
Mitglied: 60730
60730 Oct 24, 2009 at 18:04:35 (UTC)
Goto Top
Servus Harry,

das war doch keine Frage, sondern ein Tipp...

Larz fehlte wohl nur noch etwas Zeit - um da weiterzuschreiben.


Gruß
Member: Biber
Biber Oct 24, 2009 at 21:55:44 (UTC)
Goto Top
Hallo Larz,

danke für das Posten dieses Tipps hier in "Batch & Shell".

Einen Tipp zum Tipp hätte ich noch.
Du schreibst:
Variablen.ini
Hier stehen wirklich nur die Variablen drin, also alles was nach dem set-Befehl kommt.
Hier dürfen auch keine REMs oder ECHOs drin sein, weil jede Zeile in einer Schleife aufgerufen wird
Gerade weil ich auch selbst die Schwierigkeiten kenne, ein von anderen Codern erstelltes Skript nachvollziehen zu wollen (oder auch ein von mir geschriebenes nach ein paar Monaten verstehen zu wollen), deshalb halte ich Kommentare für dringend anzuraten.
Eigentlich sogar für ein Merkmal von Codequalität, auch wenn das sicherlich keine Vokabel ist, die nun im Batch-Bereich üblich ist.

Jedenfalls haben auch die RedmonderInnen unterstellt,
  • Text-, Ini- und Parameterdateien werden Kommentarzeilen enthalten
  • und diese werden im Batch mit FOR/F-Anweisungen aus- bzw. eingelesen.

Die Hilfe zu FOR deutet das auch irgendwie an:
FOR /?
...
    wörter enthält, um verschiedene Parameter für die Analyse anzugeben. Diese
    Schlüsselwörter sind:

        eol=c           - Gibt das Zeichen für Zeilenendekommentare an
                          (nur eins).
....
    Einige Beispiele:

FOR /F "eol=; tokens=2,3* delims=, " %i in (Datei.txt) do @echo %i %j %k

    Dadurch wird jede Zeile in der Datei Datei.txt ausgewertet, Zeilen die
    mit einem Semikolon beginnen werden ignoriert, für den 2. und 3. Token
    ...

Das bedeutet, um die zugehörigen Parameter-Dateien etwas wartbarer und verständlicher zu machen sind Kommentarzeilen durchaus möglich.
(Richtig ist natürlich: REM- oder ECHO Zeilen sind nicht möglich.)

Untergegangen in der M$-Hilfe ist:
als Default für Kommentarzeilen hast du ohnehin das ";" (Semikolon) immer eingestellt, auch ohne EOL zu erwähnen.
Beispiel/Demo
D:\temp>type d:\temp\variablen.ini
; Die Datei Computernamen.txt MUSS im angegebenen Pfad existieren
Computernamen=C:\Schulungsraum\Computernamen_Schulungsraum.txt
; Die Mac-Adressendatei MUSS im angegebenen Pfad existieren
Mac-Adressen=C:\Schulungsraum\Mac-Adressen_Schulungsraum.txt
; Daten der Schüler ... Verzeichnis wird bei Bedarf angelegt
DatenFuerSchueler=C:\Schulungsraum\Daten_fuer_Schueler
WOL=C:\Schulungsraum\woL.exe

D:\temp>for /f %i in (d:\temp\variablen.ini) do @echo set %i
set Computernamen=C:\Schulungsraum\Computernamen_Schulungsraum.txt
set Mac-Adressen=C:\Schulungsraum\Mac-Adressen_Schulungsraum.txt
set DatenFuerSchueler=C:\Schulungsraum\Daten_fuer_Schueler
set WOL=C:\Schulungsraum\woL.exe

Grüße
Biber
Member: ITIL-Harry
ITIL-Harry Oct 24, 2009 at 22:27:20 (UTC)
Goto Top
OK - Sorry - hab meinen Kommentar umgeschrieben, jetzt ist es ein Ergäzungsvorschlag
Member: Larz
Larz Oct 26, 2009 at 10:51:57 (UTC)
Goto Top
Hoi Biber,

danke für die Ergänzung. Das mit dem Semikolon habe ich da wohl überlesen... ist so natürlich viel praktischer, da nachvollziehbar....

Gruß
Larz
Member: v-m-r-de
v-m-r-de Jul 15, 2010 at 06:32:51 (UTC)
Goto Top
Hi Larz,

würde anstelle von xcopy nicht robocopy mehr sinn machen?
Es würde dann nur Dateien erneut Kopiert werden, die sich tatsächlich auf dem Schüler PCs geändert haben.

Gruß,
Volker
Mitglied: 60730
60730 Jul 15, 2010 at 06:55:43 (UTC)
Goto Top
Moin,
Zitat von @v-m-r-de:
Hi Larz,

würde anstelle von xcopy nicht robocopy mehr sinn machen?
Es würde dann nur Dateien erneut Kopiert werden, die sich tatsächlich auf dem Schüler PCs geändert haben.
"So" wie es jetzt da steht ja - weil der Xcopy parameter /D in der Zeile nicht steht.
Stände der da - gings auch mit "Boardmitteln" (robocopy ist ja beim Reskit dabei)

Gruß,
Volker