2016-04-01 7 views
0

Ich frage mich, ob Sie bitte helfen können? Ich muss ein Powershell-Skript schreiben, um ein MSI-Skript auszuführen.Powershell-Skript - Start-Job & MSIEXEC

Ich muss auch eine Auszeit für den Prozess festlegen (wie die MSIs wir manchmal hängen hängen).

Ich habe gesehen, dass Sie dies mit dem Start-Job acheive können/Wait-Job Prozess

Offensichtlich Sie den Code unten in in einem schweren Zustand der Metzgerei derzeit

Vielen Dank im Voraus

$timeoutSeconds = 20 

$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "My File" } | select UninstallString$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "Vix.Cbe.SalesTransaction" } | select UninstallString 
Echo "uninstall32 :" $uninstall32 

if ($uninstall32) { 
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" 
$uninstall32 = $uninstall32.Trim() 
$32p = @("/X", "$uninstall32", "/b") 
} 
Echo "uninstall32 :" $uninstall32 
Echo "u32 :" $32p 


$32j = Start-Job msiexec -ArgumentList $32p 

if (Wait-Job $32j -Timeout $timeoutSeconds) { Receive-Process $32j } 
Remove-Process -force $32j 
+0

Also, was ist das Problem? Der von Ihnen bereitgestellte Code sollte in der Regel funktionieren. – majkinetor

+0

Das Problem ist es nicht :) Syntax Fehler, Fehler über Start-Job wollte einen Code-Block nicht eine Zeichenfolge usw. – Nique

+0

Geben Sie Fehler, lesen wir nicht Köpfe oder RAM auf die Entfernung :) Und BTW, trat Sie zwei Zeilen im Skript (Ich weiß nicht, ob aus Versehen beim Kopieren hier oder seine tatsächlich im Skript): 'wählen Sie UninstallString $ uninstall64' – majkinetor

Antwort

0

Sie müssen nicht mit Jobs zu tun, um dies zu tun. Hier ist der einfache Weg:

start Notepad -PassThru | select -ExpandProperty id | set id 
sleep 60 
kill $id -ea 0 

Dies könnte nicht funktionieren, wenn App eine andere App und tritt als die Id laicht falsch. In diesem Fall müssen Sie wahrscheinlich in der Prozessliste oder über die Parameter der Befehlszeile suchen.

+0

Das scheint nicht zu funktionieren, es scheint pausing die Ausführung des MSIEXEC für die Ruhezeit – Nique

+0

Das ist nicht möglich, etwas anderes könnte das Problem sein. Sie können die Ausführung des Programms nicht anhalten, ohne andere Mittel zu verwenden. Sie können oben Beispiel wie es ist versuchen und es wird funktionieren. Wie ich schon sagte, das Problem könnte sein, dass MSI einen anderen Prozess erstellt. – majkinetor

0

Dank Majkinetor gelang es mir, den Code ausreichend zu ändern, um mein Ziel zu erreichen.

Die einzige Sache ist, dass offensichtlich, ob der Prozess immer noch aktiv zu deinstallieren ist oder nicht, ist es nach dem TOSecs Wert getötet.

Das sollte für das, was ich brauche, gut genug sein.

Also für alle andere die Suche nach einer ähnlichen Lösung zu erklären:

Dieser Prozess prüft sowohl 32-Bit und 64-Bit-Registrierungseinträge für eine MSI ähnlich den Servicenamen (Urbancode Deploy-Parameter ist der ‚$ {p: Servicename }‘

an das Skript zur Laufzeit) übergeben Wenn es einen Eintrag findet wird es um die deinstallation Code für die spezifische 32/64 MSI

/x = Deinstallieren

$ uninstall64/32 = GUID ausführen des Deinstallationsteils zu das MSI

/nq = leise Deinstallation ohne GUI (infact in Isolation Prüfung erhalten Sie einen Ja/Nein Dialog)

Die Deinstallation wird für den Betrag von Sekunden laufen, die Sie in $ TOSecs gesetzt

Hoffe, das hilft jemand anderen

$TOSecs  = 30 
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "'${p:ServiceName}'" } | select UninstallString 
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "'${p:ServiceName}'" } | select UninstallString 

if ($uninstall64) { 
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" 
$uninstall64 = $uninstall64.Trim() 
Write "Uninstalling 64bit " '${p:ServiceName}' 

start-process "msiexec.exe" -arg "/X $uninstall64 /nq" -PassThru | 
select -ExpandProperty id | set id 
#Echo "proc id = "$id 
sleep $TOSecs 
kill $id -ea 0 
} 

if ($uninstall32) { 
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" 
$uninstall32 = $uninstall32.Trim() 
Write "Uninstalling 32bit " '${p:ServiceName}' 

start-process "msiexec.exe" -arg "/X $uninstall32 /nq" -PassThru | 
select -ExpandProperty id | set id 
#Echo "proc id = "$id 
sleep $TOSecs 
kill $id -ea 0 
} 
Verwandte Themen