Batch [Autoit] iTunes silent deinstallieren - Skript läuft unter WinXP nicht durch

xedoc

nicht mehr wegzudenken
Hallo zusammen,

damit ich iTunes vernünftig als Paket verteilen kann möchte ich es vorher sauber entfernen. Dazu verwende ich den unten stehenden AutoIT-Code. Der läuft einwandfrei unter Windows 7 (x86/x64) durch. Unter XP läuft er die Schleife aber nur einmal durch und springt dann komplett aus dem Skript. Hat irgendjemand eine Ahnung woran das liegen könnte?
Unter uninstall_iTunes_64 wird nur ein anderer Registrypfad verwendet.
(Skript kann nat. auch verwendet werden um anderen Programme zu entfernen)

Code:
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****



Dim $SupportedApps = "Apple Application Support,Apple Mobile Device Support,Bonjour,iTunes"
Dim $MyApps = StringSplit($SupportedApps, ",")
Dim $InstalledAppsCount = 1
Dim $Found = 0

While 1
        $SubKey = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", $InstalledAppsCount)
	If @error Then ExitLoop

        $DisplayName = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $SubKey, "DisplayName")
        For $i = 1 To $MyApps[0]
            If StringInStr($DisplayName, $MyApps[$i]) Then
				$Found += 1
                                 RunWait(@ComSpec & ' /c start /wait MsiExec.exe /X' & $SubKey  & ' /qn /norestart', 'C:', @SW_HIDE)
                                 [B][SIZE=4] ;~ Unter XP läuft er hier einmal durch und springt dann raus.[/SIZE][/B]
            EndIf
	Next
       $InstalledAppsCount += 1
WEnd

If @OSArch = "X64" Then
	RunWait(@ScriptDir & "\uninstall_iTunes_64.exe")
EndIf
 
Hmm, der Code schaut an sich ganz gut aus. Ich hab kein Apple-Produkt installiert (und werd es auch nicht tun), daher kann ich nur raten, aber kann es sein dass der Subkey im Uninstall-Tree vllt. aus einer CLSID (z.B.: {26A24AE4-039D-4CA4-87B4-2F83217010FF}) besteht?
Denn dann würde ich vermuten dass beim aufruf von Comspec es ein Problem mit dem Auskommentieren des Befehlsaufrufs besteht.

Sprich: Die geschwungenen Klammern versauen den Programmaufruf.

Ich würde an deiner Stelle mal die Zeile
Code:
RunWait(@ComSpec & ' /c start /wait MsiExec.exe /X' & $SubKey  & ' /qn /norestart', 'C:', @SW_HIDE)
durch
Code:
RunWait(@ComSpec & ' /k start /wait MsiExec.exe /X' & $SubKey  & ' /qn /norestart', 'C:', @SW_HIDE)
ersetzen damit du siehst was abgeht

Wenn es ein Issue mit den {} Klammern ist, dann kannst du nur probieren diese so zu verwenden:
^{ und ^}

Das ignoriert die Klammern als Operator in Batch und stellt sie als Zeichen dar.
 
Code:
RunWait(@ComSpec & ' /c start /wait MsiExec.exe /X' & $SubKey  & ' /qn /norestart', 'C:', @SW_HIDE)
durch
Code:
RunWait(@ComSpec & ' /k start /wait MsiExec.exe /X' & $SubKey  & ' /qn /norestart', 'C:', @SW_HIDE)

Wenn ich das mache bleibt die Kommandozeile offen. ;)

Das erste gefundene Produkt läuft ja auch durch, aber dann beendet sich das Skript. So als ob es in der Schleife direkt beendet wird.
(Wie gesagt, unter Windows 7 läuft es ja durch und deinstallierte alle angegebenen Programme).

Ich löse es jetzt erstmal "dreckig" und rufe das Skript via Schleife unter Xp halt mehrmals aus.
 
Das die Kommandozeile offen bleibt ist klar, ich dachte nur, dass da vllt. eine Fehlermeldung kommt.

Weiters hab ich nicht kapiert dass das Script sich beendet. Ich dachte dass da mehrere Aufrufe kommen die nicht ausgeführt werden...
 
Nein, durchläuft exakt einmal die Schleife und fliegt dann irgendwo raus. Rufe ich das Skript unter XP mehrmals hintereinander auf deinstalliert er pro Aufruf ein Produkt. Ich habe keinen blassen Schimmer mehr woran das liegen könnte, rufe jetzt aber das Skript einfach in einer for-Schleife ($MyApps[0]) auf. Das reicht erstmal. ;)

Unter 7/Vista/2008R2 durchläuft er die Schleife korrekt mehrmals und es reicht ein Aufruf des Skriptes.
 
Hmm...

<yoda on>
Ein merkwürdiges dieses Verhalten ist...
<yoda off>

ehrlich gesagt, ich kenn mich mit AutoIT nicht so aus, ich arbeite immer mit AutoHotkey (was ja bedingt ein Derrivat von AIT ist), daher kann ich nicht so ad-Hoc sagen ob es ein falscher Parameter oder so ist.


However, ich hab mich mal ein bisschen mit dem Problem befasst, und weil ich ja praktisch keine Ahnung von AutoIT hab, es in AutoHotkey neu geschrieben.
Ich hab es nicht unter x64 getestet, denn ich hab gerade keine x64 VM zur hand, aber unter der x86 VM (Win XP) funktioniert es prächtig.
BTW: Du hast den Apple Software Update nicht mit eingeschlossen was die Deinstallationsroutine angeht.

Code:
SetWorkingDir, %A_ScriptDir%

If (!A_IsAdmin) {
	Run, *RunAs %A_ScriptFullPath%
	ExitApp
}

spara = %1%
If (spara = "/Src") {
	FileInstall, apple.ahk, apple.ahk, 1
	ExitApp
}

reg_default := 32
targets		:= "Apple Application Support,Apple Mobile Device Support,Bonjour,iTunes"
msiexec		:= A_Windir "\system32\msiexec.exe"
msiexec64	:= A_Windir "\syswow32\msiexec.exe"

Loop, 2 {
	If (!A_Is64bitOS AND A_Index = 2)
		Continue
	reg_default *= A_Index
	SetRegView, %reg_default%
	Loop, Parse, targets, `,
		{
		Loop, HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, 1, 1
			{
			If (A_LoopRegSubKey != done) {
				RegRead, DisplayName, HKLM, %A_LoopRegSubKey%, DisplayName
				If Errorlevel
					Continue
				done := A_LoopRegSubKey
				If (DisplayName = A_LoopField) {
					If (reg_default = 32) {
						ToolTip, Deinstalliere %DisplayName% (x86)
						RunWait, % (A_Is64bitOS ? msiexec64 : msiexec) " /X" SubStr(A_LoopRegSubkey, 53) " /qn /norestart", C:, Hide
						Continue
					}
					If (reg_default = 64) {
						ToolTip, Deinstalliere %DisplayName% (x64)
						RunWait, % msiexec " /X" SubStr(A_LoopRegSubkey, 53) " /qn /norestart", C:, Hide
						Continue
					}
				}
			}
		}
	}
}

Ich hoffe, es hilft dir...

PS.: Wenn du das script modifizierst und neu kompilieren musst, dann verwende die AHK_L Version 1.1.08+
 

Anhänge

  • apple.zip
    390,4 KB · Aufrufe: 155
Code:
If [B][COLOR="#FF0000"]@OSArch = "X64"[/COLOR][/B] Then
	RunWait(@ScriptDir & "\uninstall_iTunes_64.exe")
EndIf


Vieleicht kennt XP die Abfrage nicht. Versuche mal:
Code:
If [B][COLOR="#FF0000"]@OSversion = "WIN_7"[/COLOR][/B] Then
	RunWait(@ScriptDir & "\uninstall_iTunes_64.exe")
EndIf

Oder diesen Abschnitt komplett weglassen unter XP. Denke doch das Du XP 32Bit hast.
 
Leider ist das mehr als 1 Rechner. Rauskommen soll dabei ein Paket welches ich per OCS verteilen kann.

@Razorblade: Werde ich bei Gelegenheit mal mit AHK versuchen. Das Software Update hatte ich bisher nie mitinstalliert, habe es aber mal mit aufgenommen. Man weiß ja nie. ;)
 
@xedoc: Habs nur erwähnt weil ich vorher ja zum testen iTunes unter XP installiert hab und da hat es sich automatisch mitinstalliert...
 
Oben