noobstar0815
Goto Top

Update-Skript mit Batch-Datei

Guten morgen face-smile

An diesem Skript saß ich, als Fachinformatik-Azubi fast 1 Woche. Da mir dieses Forum ziemlich geholfen hat, dachte ich, ich stelle es mal als Anleitung hier rein, da es sehr praktisch ist, wenn man mehr als 10 Rechner Updaten muss.
Dieses Skript bezieht sich auf Updates von Java, Adobe Programmen, Firefox und MS Defender, allerdings kann mit selbigen Prinzip eigentlich alles aktualisiert werden.
Meine Skripte liegen in dem Ordner G:\automatischeupdateswoechentlich\Update-Skripte. G:\ ist unser Server; da mir der ganze Pfad zulang war, habe ich es am Anfang des Skriptes per "net use" definiert. Ich habe aus Gründen der Wartung für jedes einzelne Programm welche aktualisiert wird noch eine eigene Batch-Datei erstellt. Die Patches lade ich mir wenn möglich direkt als .msi, alternativ geht es auch als .exe. Diese liegen in G:\automatischeupdateswoechentlich\Java(oder Adobe Flash Player Active X etc). Am Anfang der Datei mache ich eine kurze Abfrage, ob ich entweder [1] Alle Programme aktualisieren möchte, oder [2] ausgewählte Programme aktualisiere.
Ich persönlich fand die Funktion für [2] ziemlich schwierig zu verstehen bzw. rauszufinden, da sie nicht dokumentiert ist. Die Funktion lautet
 
set name=0
set /p name="Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134):"  

set "num=-1"   
:loop 
set /a num=num+1 

call set "name2=%%name:~%num%,1%%"   
if defined name2 ( 
echo(%name2% 
if "%name%"=="" goto END  
if %name2%==1 call "G:\Update-Skripte\Java.bat"  
if %name2%==2 call "G:\Update-Skripte\FlashX.bat"  
if %name2%==3 call "G:\Update-Skripte\FlashPlug.bat"  
if %name2%==4 call "G:\Update-Skripte\shockwave.bat"  
if %name2%==5 call "G:\Update-Skripte\Firefox.bat"  
if %name2%==6 call "G:\Update-Skripte\adobereader.bat"  
if %name2%==7 call "G:\Update-Skripte\msdefender.bat"  
if %name2%==8 shutdown -r -t 0
if %name2%==9 shutdown -c -t 0
goto :loop 
) 
Sinn dieses Codes ist es, dass "num" angibt, von welcher Stelle in "name" an gesucht wird. 1%% gibt dabei an, wie viele Zeichen durchsucht werden, das heißt gibt man dort 5 an, scannt er am "num" die nächsten 5 Zeichen. Da er mit 1%% aber jedes Zeichen einzeln nimmt, und da "num" immer weiterläuft und so verhindert wird, dass mehrfach die selbe Stelle abgefragt wird, kann man so eine beliebig lange Zeichenfolge eingeben.
Die Antwortmöglichkeiten stehen ein Stück über dem "set name=0", aber da diese grade nicht wichtig sind, lasse ich sie aus.
Mir "shutdown -r /-c" kann ich noch angeben, ob ich den PC anschließend neustarten oder herunterfahren möchte, oder weder noch. Wichtig ist, dass, da die "shutdown"-Befehle auf 8 bzw 9 definiert wurden, diese Zahl unbedingt zum Schluss kommt, da der PC sonst mitten während der Batch-Vorgang läuft heruntergefahren wird.
Wie schon erwähnt verweisen die if-Bedingungen nicht direkt auf die zu installierende Datei, sondern nur auf eine weitere Batch Datei. Diese Batch-Dateien sehen ca. so aus:
 @for %%f in ("G:\Adobe Shockwave\*.*") do start /wait "" "%%f" /qn  
echo Shockwave fertig
Da sie alle etwas variieren kann ich gerne auf Nachfrage die restlichen auch noch posten. Durch "@for %%f in (...\*.*)"
wird jede Datei in diesem Ordner mit "do start /wait "" "%%f" /qn" ausgefüht. /qn deaktiviert bei einer .msi die grafische Oberfläche. /wait gibt an, dass die Datei solange geöffnet bleibt, bis der Update-Vorgang abgeschlossen ist. Dies ist wichtig, da die Hauptdatei diese Datei mit "call" gerufen hat, und auch erst weiter macht, sobald die Datei geschlossen wurde. (Tut mir leid, etwas unverständlich, weiß grade nicht genau wie ich es schreiben soll) Für den Fall dass doch alle Updates installiert werden, habe ich wie schon erwähnt zu Beginn eine Abfrage gemacht. Wird diese mit [1] für Alle beantwortet, springt die Datei per "goto" zu :ALL. :ALL ist simpel aufgebaut, die Dateien werden nacheinander per "call" gerufen, dabei gibt "echo" an welche Datei er grade ruft. Diese Dateien enthalten selbst noch ein "echo Fertig" welches mir sagt, dass der Update-Vorgang dieser Datei abgeschlossen wurde (sagt aber nicht, ob ein Fehler vorliegt oder nicht). So ich denke das war es im Großen und Ganzen, zum Schluss noch einmal der gesamte Code falls es jemanden intressiert. Für Fragen, Anmerkungen oder Verbesserungen bin ich jeder Zeit offen, trotzdem hoffe ich dass es euch gefällt =)
Falls es bezüglich des Codes fragen gibt schreibt mich einfach an =)
EDIT: Mir wurde geraten statt des net use mit PUSHD und POPD zu arbeiten. Dies macht auch Sinn, allerdings hatte ich zu dem Zeitpunkt schon alles soweit fertig, dass es keine Probleme mit net use mehr gab, deshalb habe ich es nicht geändert.
cls
@echo off
rem lw vorab auf default K: setzen
set lw="K:"  
echo Der aktuell ausgewaehlte Laufwerksbuchstabe ist %lw%. Falls Sie ihn aendern     moechten geben Sie bitte einen neuen Laufwerksbuchstaben an.
set /p lw="Bitte freien Laufwerksbuchstaben angeben (K:): "  
net use %lw% \\WWW-HGR\BDR\BDR-Benutzer\Ausbildung\automatischeUpdateswoechentlich\Update-Skripte
echo		Updates
echo		=======
echo.
echo	[1] Alle Updates
echo	[2] Einzelne Updates
echo	[3] Alle Updates mit Herunterfahren
echo	[4] Alle Updates mit Neustarten

set asw=0
set /p asw="Bitte Auswahl eingeben (Bsp.: 2): "  

if %asw%==1 set name=1234567 & set "num=-1" & goto LOOP  
if %asw%==2 goto DIV
if %asw%==3 set name=12345679 & set "num=-1" & goto LOOP  
if %asw%==4 set name=12345678 & set "num=-1" & goto LOOP  

:DIV
echo.
echo	[1] Java
echo	[2] Flash Player Active X
echo	[3] Flash Player Plug-In
echo	[4] Shockwave
echo	[5] Firefox
echo	[6] Reader
echo	[7] Microsoft Windows Defender
echo	[8] Neustart (nur als letzte Ziffer!!!)
echo	[9] Herunterfahren (nur als letzte Ziffer!!!)
echo.
set name=0
set /p name="Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134):"  


set "num=-1"   
:loop 
set /a num=num+1 

call set "name2=%%name:~%num%,1%%"   
echo "%name2%"    
if "%name2%"=="" goto END  
if %name2%==1 call "%lw%\Java.bat"  
if %name2%==2 call "%lw%\FlashX.bat"  
if %name2%==3 call "%lw%\FlashPlug.bat"  
if %name2%==4 call "%lw%\shockwave.bat"  
if %name2%==5 call "%lw%\Firefox.bat"  
if %name2%==6 call "%lw%\adobereader.bat"  
if %name2%==7 call "%lw%\msdefender.bat"  
if %name2%==8 shutdown -r -t 0
if %name2%==9 shutdown -c -t 0
goto LOOP 
)
goto END

:END
net use %lw% /d
echo Druecken Sie eine beliebige Taste zum Beenden des Programmes.
pause

Content-Key: 203172

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

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

Member: nikoatit
nikoatit Mar 12, 2013 at 09:17:21 (UTC)
Goto Top
Moin,

vielen Dank für deine Mühe und die Veröffentlichung deiner Arbeit!
Allerdings finde ich etwas fummelig rein über Batch und würde eher ein Programm wie WPKG dafür empfehlen.

Gruß
Member: Noobstar0815
Noobstar0815 Mar 12, 2013 at 10:54:51 (UTC)
Goto Top
Naja, ich bin Azubi im 1. Lehrjahr :D Das heißt für mich war es so ganz gut, da ich so etwas gelernt habe :D
Member: nikoatit
nikoatit Mar 12, 2013 at 14:05:08 (UTC)
Goto Top
Ist auch nicht verkehrt, besonders wenn du später vielleicht etwas mehr richtung Skripting und/oder Deployment gehen willst.
Die meisten Softwareverteilungsprogramme setzen ja auf (Win-)Batch auf.