Hi ,
ich hatte mir eine kleine Hotfix Update Rotine geschrieben, die in etwa das macht, was auch die diversen HotfixPaketet machen.
Ein Nebenprodukt ist dieses Script hier geworden.
Ein Script mit dem man alle Patches aus einem Ordner (z.B den DATA Ordner aus dem Update Pack von Winboard.org) in eine XP-CD mit SP2 integrieren kann.
Zuerst wird nach dem Ordner gefragt wo der "I386" Ordner drin liegt.
Dann wird nachdem Ordner gefragt wo die Hotfixes drin liegen.
Den Rest besorgt das Script.
Die CD müßt Ihr hinterher natürlich noch selber Brennen.
Das ganze ist noch nicht 100 % getestet, also keine Garantie, das es klappt
Ich hoffe aber schon.
C
#include <file.au3>
#include <Process.au3>
#include <Date.au3>
#include <Constants.au3>
#include <Array.au3>
Opt("RunErrorsFatal",0)
Opt("TrayIconDebug", 1) ; zeigt am trayicon welchen Befehl das Script gerade Ausführt
$hotfix_inifile = @TempDir & "\hotfix.ini"
dim $KB_read
dim $hotfixfind
dim $hotfixfile
dim $search2
dim $abbruch
dim $hotfix_dir
dim $mylist
dim $Form1
dim $anzahl_Patches
dim $strArr
Dim $mapdrive
Dim $CHECK_RUN
dim $installierte_Patches
dim $progress_full
Global $zaehler
dim $deltafile
dim $font
dim $myprogress
dim $mylabel
dim $myprogress
dim $OS_INFO
dim $i386
;--- HOTKEY für Abbruch -----
HotKeySet("!{ESC}","abbruch")
; --- Programm ablauf
FileDelete("c:\integrate.log")
slipstream()
;--- Funktionen
Func slipstream()
$i386 = FileSelectFolder("Ordner für XP SP2 Boot CD auswählen", "")
$hotfix_sp2_dir = FileSelectFolder("Ordner mit den zu integrierenden Files auswählen", "")
$hotfix_dir = $hotfix_sp2_dir
Hotfix_auslesen_xp_sp2()
slipstream_sp2()
EndFunc
Func slipstream_sp2()
; Gui erzeugen
$Form1 = GUICreate("Update Übersicht", 700, 220, 10 , 10)
$myprogress = GUICtrlCreateProgress(150,180,500,20)
$OS_INFO = GUICtrlCreateLabel(@OSversion & " " & @OSServicePack & " Hotfix Updater by WOLKE",150,20,300,50)
$mylabel = GUICtrlCreateLabel($deltafile & @CR & "wird jetzt integriert"& @CR & "Update " & $zaehler & " von " & $anzahl_Patches, 150, 100, 500, 150)
GUICtrlSetFont ($mylabel,14, 400, 1, $font)
If DriveGetType($hotfix_dir) = 'Network' And DriveGetType($hotfix_dir) <> 'Unknown' Then
$mapdrive = DriveMapAdd("*", $hotfix_dir)
EndIf
;~ DriveMapAdd("B:", $hotfix_dir)
FileChangeDir( $mapdrive)
;--- neue Methode mit 1D Array
$var = IniReadSection($hotfix_inifile,"HOTFIX"); INI Datei in 2D Array einlesen
If @error Then
;~ exit_error_func()
DriveMapDel($mapdrive)
MsgBox(64,"ACHTUNG","keine neuen Patches gefunden" & @CR & "Überpfüfung wird beendet",4)
Exit
Else
;--- ARRAY von 2D nach 1D wandeln, Thanks To ARI
$anzahl_Patches = $var[0][0]
For $i = 1 To $var[0][0]
$strArr = $strArr & '|' & $var[$i][0]
Next
If StringLeft($strArr , 1) = '|' Then
$strArr = StringTrimLeft($strArr, 1)
EndIf
$arrNewArr = StringSplit($strArr, '|')
_ArraySort( $arrNewArr)
;--- $hotfix_inifile sortiert zurückschreiben
FileDelete($hotfix_inifile); erst löschen
For $i = 1 To $arrNewArr[0]
IniWrite($hotfix_inifile,"HOTFIX",$arrNewArr[$i],1)
Next
;--- sortiertes Array - Patches nacheinander installieren
$anzahl_Patches = $arrNewArr[0]
;~ ProgressOn("Windowsupdate","Updates werden installiert",10 , @DesktopWidth/2-200,16)
For $i = 1 To $arrNewArr[0] ;$arrNewArr[0] entspricht der Anzahl der zu instalierenden Patches
GUICtrlDelete($mylist)
$mylist = GUICtrlCreateList("",5 ,15, 120, 200)
Liste_anzeigen()
$zaehler= $i
$search = FileFindFirstFile("*" & $arrNewArr[$i] & "*"); Suche nach dem Patch mit der KB-Nummer
If @error Then ExitLoop
$deltafile = FileFindNextFile($search) ; Name des kompletten Files finden
;~ MsgBox(0,"",$deltafile)
FileClose($search)
;~ SplashTextOn("Windowsupdate",$deltafile & " wird jetzt installiert"& @CR & "Update " & $zaehler & " von " & $anzahl_Patches , 600, 50, @DesktopWidth/2-300, 10)
$progress_full = (100/$anzahl_Patches*$zaehler)
;~ ProgressSet($progress_full, "HOTFIX " & $zaehler & " von " & $anzahl_Patches & " wird jetzt installiert", $deltafile)
GUICtrlSetData($myprogress,$progress_full)
GUICtrlSetData($mylabel,$deltafile & @CR & "wird jetzt installiert"& @CR & "Update " & $zaehler & " von " & $anzahl_Patches)
GUISetState()
RunWait($deltafile & ' /passive /integrate:' & $i386 & ' /log:c:\temp.log')
_RunDOS('echo ----------------------------------------------------- >>c:\integrate.log')
_RunDOS('type c:\temp.log >>c:\integrate.log')
$logfile = FileOpen("c:\temp.log", 0)
; Check if file opened for reading OK
If $logfile = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Read in lines of text until the EOF is reached
While 1
$line = FileReadLine($logfile)
If @error = -1 Then ExitLoop
$integrateerror = StringInStr($line, "Fehler")
if $integrateerror > 0 Then
MsgBox(4096,"ACHTUNG","Es ist ein Fehler beim integrieren des Hotfixes aufgetreten." & @CR & "Bitte überprüfen Sie das Logfile")
EndIf
Wend
FileClose($logfile)
IniDelete($hotfix_inifile,"HOTFIX",$arrNewArr[$i]) ; installieren Patch aus der INI-Datei entfernen
;~ SplashOff()
if $zaehler == $anzahl_Patches Then exitfunc()
$var2 = EnvGet("abbruch") ; IF (Abbruch Variable durch HOTKEY ausgelößt) THEN Abarbeitung beenden
if $var2 == 1 Then
MsgBox(4096,"Windowsupdate", "Das Update wird auf Anforderung abgebrochen" & @LF & "Beim nächsten LOGIN wird an dieser Stelle angeknüpft",4)
exitfunc()
EndIf
Next
GUIDelete($Form1)
EndIf
EndFunc
Func Hotfix_auslesen_xp_sp2()
FileDelete($hotfix_inifile) ; Neustart
FileChangeDir ($hotfix_dir) ; Pfad zu den ausgepackten Hotfixes
$search2 = FileFindFirstFile("*-x86-*.exe"); Suchmuster für Patchfiles
If $search2 = -1 Then
MsgBox(16, "Error", "Keine Patchfiles gefunden - Bitte das Quellverzeichnis überprüfen")
Run("Explorer " & $hotfix_dir)
Exit
Else
;--- Liste der Hotfixes im Hotfixverzeichnis nach Muster KB?????? erstellen
While 1
$hotfixfind = FileFindnextFile($search2) ; erstes Patchfile ;~ MsgBox(0, "", $hotfixfind)
if @error = 1 Then ExitLoop
$KB_STRING = StringSplit($hotfixfind,"-x86-",1) ;KB Nummer isolieren 1 ;~ MsgBox(0, "", $KB_STRING[1])
$KB_STRING2 = StringSplit($KB_STRING[1],"-",1) ;KB Nummer isolieren 2 ;~ MsgBox(0, "", $KB_STRING2[2])
IniWrite($hotfix_inifile,"HOTFIX",$KB_STRING2[2],1) ;KB Nummer in INI-File schreiben
WEnd
FileClose($search2); Close the search handle
EndIf
;~ Hotfix_vergleich_xp_sp2()
EndFunc
Func Liste_anzeigen()
;--- Patchliste erzeugen
$deltafile = IniReadSection($hotfix_inifile,"HOTFIX")
For $i = 1 To $deltafile[0][0]
GUICtrlSetData($mylist,$deltafile[$i][0])
IniWrite($hotfix_inifile,"NOW",$deltafile[$i][0],1)
Next
EndFunc
Func exitfunc()
ProgressOff()
DriveMapDel($mapdrive)
MsgBox(48,"!!! Integeration abgeschlossen !!!","Es wurden " & $zaehler & " von " & $anzahl_Patches & " Updates installiert " & @CR & "Bitte Überprüfen Sie das Logfile")
FileDelete("c:\temp.log")
Run('notepad' & ' c:\integrate.log')
Exit
EndFunc
Func exit_error_func()
DriveMapDel($mapdrive)
MsgBox(16,"FEHLER","Es ist ein Fehler bei der INTEGRATION aufgetreten",5)
Exit
EndFunc
Func Abbruch()
EnvSet("Abbruch",1)
MsgBox(24,"!!! ACHTUNG !!!","Die Update- Aktion wird nach dem nächsten Patch abgebrochen",4)
EndFunc
Alles anzeigen