cmd-Skripting mit komischen Effekten

29/01/2009 - 21:20 von Paul Muster | Report spam
Hallo,


ich hoffe, cmd-Skripting unter XP ist hier OnT, habe zumindest keine
passendere Gruppe gefunden.

Mit Hilfe eines Skripts sollen alle Hotfixe[1], die in .\patches\
liegen, installiert werden. Aber natürlich nur, wenn sie noch nicht
installiert sind.[2]

In .\patches\ liegen KB123456.exe, KB948881.exe und kb950974.exe, wobei
die letzteren beiden installiert sind.

Das Skript ist unten eingefügt. An der Ausgabe sieht man, dass vor dem
Aufrufen der Routine CheckHotFix die Variablen %hotfix% und
%installiert% nicht ausgelesen werden können. In der Routine dann aber
durchaus...
Ich hoffe, dass sich nach Klàrung dieses Punkts dann auch das Problem
löst, dass die if-Schleife niemals greift und so auch installierte
Patches nochmal installiert werden.


Danke & viele Grüße

Paul



[1] Steinigt mich bitte nicht, dass ich Patche und Hotfixe vermische.
Das sortiere ich noch, wenn das Skript funktioniert.
[2] Nein, GPO stehen nicht zur Verfügung, weil Samba 3 das noch nicht kann.


*******************************************************
Skript
*******************************************************

rem Das Grobgeruest findet sich in diversen Foren

@echo ******** ANFANG ********

@echo off
set RegHotfixListe=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Hotfix
set LOG=\\serveretstartup\log\%computername%.log
set reboot=0
set installiert=unbekannt

pushd .\patches\
@rem dort liegen die Patches in Form KB123456.exe

@rem fuer jeden Patch einmal in die Hauptschleife
for /F "usebackq" %%i in (`dir /b *.exe`) do (

@echo ****** Hauptschleife -pro Hotfix- ******

@echo i der Hauptschleife steht auf %%i
@echo demnach ist der linke teil davon %%~ni

@rem setze hotfix auf den linken Teil des Dateinamens des Patches
set hotfix=%%~ni
echo hotfix steht jetzt auf %hotfix% !!!

@echo hauptschleife vor sub. installiert steht fuer...
@echo ... Patch %hotfix% auf %installiert%
call :CheckHotFix
@echo hauptschleife nach sub. installiert steht fuer Patch %hotfix% auf
%installiert%

@ if "%installiert%"=="ja" (
echo ++++ Patch ist schon installiert
rem echo Patch %hotfix% war bereits installiert >>%LOG%
) ELSE (
@rem start /wait %%i -u -z
@echo Installation %%i
@rem echo Patch %hotfix% wurde installiert >>%LOG%
set reboot=1
)
@echo nach der if-Schleife steht installiert auf %installiert%
set installiert=unbekannt
@echo nach der if-Schleife wurde installiert auf %installiert%
zurueckgesetzt!
@echo.
)
goto ende

:CheckHotFix
@echo **** Sub pro Fix ****
@echo sub. wir pruefen fuer %hotfix%, reboot steht...
@echo ...auf %reboot%, installiert steht auf %installiert%
@reg.exe query "%RegHotfixListe%\%hotfix%" /v Installed 2>NUL | FIND
"0x1" >Nul 2>NUL
if "%errorlevel%"=="0" ( set installiert=ja ) else ( set installiert=nein )

@echo sub. installiert steht fuer Patch %hotfix% auf %installiert%

goto :eof

echo zwischen ende sub und ende haupt!!!

:ende
popd

echo haupt. reboot steht auf %reboot%

rem if "%reboot%"=="1" shutdown -r -t 10 -c "Es wurden Patches installiert."

set rebootset hotfixset LOGset RegHotfixListeset installiert



*******************************************************
ENDE Skript
*******************************************************

*******************************************************
Ausgabe
*******************************************************


******** ANFANG ********
****** Hauptschleife -pro Hotfix- ******
i der Hauptschleife steht auf KB123456.exe
demnach ist der linke teil davon KB123456
hotfix steht jetzt auf !!!
hauptschleife vor sub. installiert steht fuer...
... Patch auf unbekannt
**** Sub pro Fix ****
sub. wir pruefen fuer KB123456, reboot steht...
...auf 0, installiert steht auf unbekannt
sub. installiert steht fuer Patch KB123456 auf nein
hauptschleife nach sub. installiert steht fuer Patch auf unbekannt
Installation KB123456.exe
nach der if-Schleife steht installiert auf unbekannt
nach der if-Schleife wurde installiert auf unbekannt zurueckgesetzt!

****** Hauptschleife -pro Hotfix- ******
i der Hauptschleife steht auf KB948881.exe
demnach ist der linke teil davon KB948881
hotfix steht jetzt auf !!!
hauptschleife vor sub. installiert steht fuer...
... Patch auf unbekannt
**** Sub pro Fix ****
sub. wir pruefen fuer KB948881, reboot steht...
...auf 1, installiert steht auf unbekannt
sub. installiert steht fuer Patch KB948881 auf ja
hauptschleife nach sub. installiert steht fuer Patch auf unbekannt
Installation KB948881.exe
nach der if-Schleife steht installiert auf unbekannt
nach der if-Schleife wurde installiert auf unbekannt zurueckgesetzt!

****** Hauptschleife -pro Hotfix- ******
i der Hauptschleife steht auf kb950974.exe
demnach ist der linke teil davon kb950974
hotfix steht jetzt auf !!!
hauptschleife vor sub. installiert steht fuer...
... Patch auf unbekannt
**** Sub pro Fix ****
sub. wir pruefen fuer kb950974, reboot steht...
...auf 1, installiert steht auf unbekannt
sub. installiert steht fuer Patch kb950974 auf ja
hauptschleife nach sub. installiert steht fuer Patch auf unbekannt
Installation kb950974.exe
nach der if-Schleife steht installiert auf unbekannt
nach der if-Schleife wurde installiert auf unbekannt zurueckgesetzt!

haupt. reboot steht auf 1

*******************************************************
ENDE Ausgabe
*******************************************************
 

Lesen sie die antworten

#1 Matthias Tacke
30/01/2009 - 01:35 | Warnen spam
Paul Muster wrote:
Hallo,



auch Hallo.

ich hoffe, cmd-Skripting unter XP ist hier OnT, habe zumindest keine
passendere Gruppe gefunden.



Weiß nicht wie andere das sehen, lese heute erstmals mit.
Passend, aber in Englisch wàret alt.msdos.batch.nt

Mit Hilfe eines Skripts sollen alle Hotfixe[1], die in .\patches\
liegen, installiert werden. Aber natürlich nur, wenn sie noch nicht
installiert sind.[2]



Ich würde ja eher auf vorhandenes wie ctupdate4 zurückgreifen.
<http://www.heise.de/ct/projekte/offlineupdate/>
Artikel dazu:
<http://www.heise.de/software/downlo...ersion>

In .\patches\ liegen KB123456.exe, KB948881.exe und kb950974.exe, wobei
die letzteren beiden installiert sind.



Owei, es hat ja jeder seinen eigenen Stil aber du dokumentierst dich ja
tot. Da sieht man ja vor lauter REMs und Echos keine Befehle mehr.

Mit setlocal brauchst du die Variablen nicht aufràumen.
For /f nutze ich gerne, aber nur wenn nötig.
etc.
Ich benutze übrigens den Syntax-Highlighting Editor Textpad, mit Notepad++
<http://notepad-plus.sourceforge.net...te.htm> gibt es ein kostnloses
Pendant.

Hier eine funktional weitgehend gleiche aber deutlich gestrippte Version:


@echo off&setlocal
set "RegKey=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix"
set LOG=\\serveretstartup\log\%computername%.log
set reboot=0
pushd .\patches\
rem dort liegen die Patches in Form KB123456.exe
For %%A in (kb*.exe) do call :CheckHotFix %%~nA "%%~fA"
if "%reboot%"=="1" ^
echo shutdown -r -t 10 -c "Es wurden Patches installiert."
pause
goto :eof
:CheckHotFix Hotfix Datei
set installiert=nein
For /f "tokens=3" %%B in (
'reg.exe query "%RegKey%\%1" /v Installed 2^>NUL'
) do if "%%B" EQU "0x1" set installiert=ja
if "%installiert%"=="ja" (
echo - %1 ist schon installiert
) ELSE (
echo ++++ %1 wird istalliert %2
rem start /wait %2 -u -z
set reboot=1
)
)

HTH
Matthias

Ähnliche fragen