mayho33
Goto Top

Start-Process deinstalliert nicht als BackGroundJob (PowerShell)

Hallo @ All

Wieder einmal komme ich in Powershell nicht weiter und hoffe (wieder einmal) auf eure Hilfe!!

In diesem Thread habe ich diese Frage schon gestellt und beantwortet geglaubt, stieß jetzt aber wieder auf ein neues Problem: Start-Process gibt tlw. keinen ReturnCode aus (PowerShell)

Das aktuelle Problem:

Es geht darum eine Software silent zu deinstallieren und für die Dauer des Uninstalls in der PS-Console als Pseudo-Progressbar eine paar Sternchen auszugeben. Dazu Prüfe ich erst mal ob die Software am Client vorhanden ist und bereite den UninstallString aus der Registry entsprechend auf für Start-Process.

Ich übergebe die fertig angepassten Argumente an die Function unten. Die Argumente werden mit Write-Host in der Consloe so ausgegeben:

$FilePath: MSIEXEC.EXE
$ArgumentList: /X {C22FF2F7-BA18-4C1B-A86E-82424058293B} REBOOT=REALLYSUPPRESS MSIRESTARTMANAGERCONTROL=DISABLE /qn /l*v+ "C:\Logs\TESTsoftware 2014-03-31 11.02.36 _UNIN_.Log"

Starte ich das mit folgender Syntax so in der Console funktioniert der Uninstall:
Start-Process -FilePath "MSIEXEC.EXE" -ArgumentList '/X {C22FF2F7-BA18-4C1B-A86E-82424058293B} REBOOT=REALLYSUPPRESS MSIRESTARTMANAGERCONTROL=DISABLE /qn /l*v+ "C:\Logs\TESTsoftware 2014-03-31 11.02.36 _UNIN_.Log"' -wait

übergebe ich das an die Function und lasse es ausführen, bekomme ich entweder einen Fehler...

Start-Process : Es wurde kein Positionsparameter gefunden, der das Argument "C:\Logs\TESTsoftware" akzeptiert.
In Zeile:1 Zeichen:1

back-to-topStart-Process -FilePath "MSIEXEC.EXE" -ArgumentList "/X {C22FF2F7-BA18-4C1B-A86E ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Start-Process], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand


... oder es passiert Garnichts. Es laufen die Sternchen, kein RC und die Software ist nicht deinstalliert.

Lasse ich das Logging weg ( /l*v+ "C:\Logs\TESTsoftware 2014-03-31 11.02.36 _UNIN_.Log" ) funktionierts auch.

Der Fehler liegt also in der Syntax beim übergeben des Argument-Strings. Bekomme es aber irgendwie nicht gebacken den String so zu übergeben, dass das Logging drinnen ist. Gibt es da eventuell einen Kniff?

Function Uninstall {
[CmdletBinding()]
param ($FilePath, $Arguments)

$ReturnCode = @{}

$BackGroundWorker = [Powershell]::Create().AddScript({
param($result)
$rc = Start-Process -FilePath $FilePath -ArgumentList $Arguments -PassThru -Wait
$result.ExitCode = $rc.ExitCode
}).AddArgument($ReturnCode)

$BackGroundWorker.BeginInvoke()| Out-null

while($BackGroundWorker.InvocationStateInfo.State -eq "Running"){
write-host "*" -NoNewLine
sleep(2)
}
return $ReturnCode
}

Vielen Dank für die Unterstützung!

Mayho

Content-Key: 233955

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

Ausgedruckt am: 28.03.2024 um 12:03 Uhr

Mitglied: colinardo
colinardo 31.03.2014 aktualisiert um 11:45:50 Uhr
Goto Top
ähm das doppelte Dollarzeichen ist da nicht gut platziert:
$$rc = Start-Process ......
Grüße Uwe

p.s. und nutze in Zukunft Code-Tags für deinen Code ...merci.
Mitglied: mayho33
mayho33 31.03.2014 aktualisiert um 12:27:48 Uhr
Goto Top
Hi!

Ist nur ein Schreibfehler hier im Post...

Jop! Codetags wären wohl ne Verbesserung. Hole das nach.


GROSSES EDIT:
Der Fehler war meine Lesefaulheit. MS machts einem aber auch nicht einfach. :P

Die Lösung: Argumentlist kann eine durch Komma getrennte ArgumentListe sein ( -ArgumentList Syntax: $arg1,$arg2,arg3,... )

Nach einer Anpassung ($Arguments kommt nun als Object daher in dem alle Argumente gesondert gespeichert sind) funktionierts perfekt.

$rc = Start-process -Filepath "$arg1 -Argumentlist ($arg2,$arg3,$arg4,$arg5) -wait

Danke!

lg