„Start-Process“ remote ausführen: Wie wird die Standardausgabe angezeigt?

„Start-Process“ remote ausführen: Wie wird die Standardausgabe angezeigt?

Ich habe ein PowerShell-Skript zum Installieren von Software auf Remotecomputern.

Bisher habe ich den folgenden Code erfolgreich verwendet:

$prog = "ping"
$arg = "localhost"
$computername = "MACHINE01"
invoke-command -computername $computername {param($p,$a)& $p $a} -ArgumentList $prog,$arg

Ich muss jetzt ein MSI installieren, z. B. „msiexec /ic:\file.msi /passive“.

Ich kann MSIEXEC nicht dazu bringen, alles nach „MSIEXEC“ als Parameter zu behandeln. Stattdessen versucht PowerShell, es einfach als einen großen Befehl auszuführen. Ich habe zahlreiche Dinge ausprobiert, die hauptsächlich die Platzierung von wörtlichen Anführungszeichen betrafen, aber ich bekomme es nicht zum Laufen.

Ich habe jetzt den Aufrufoperator (&) zugunsten von „Start-Process“ aufgegeben, das einen „-ArgumentList“-Parameter hat. Das MSI wird jetzt korrekt ausgeführt. Großartig!

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait -redirectstandardoutput c:\output.txt; get-content c:\output.txt} -ArgumentList $prog,$arg

Das Problem mit „Start-Process“ besteht darin, dass es keine Konsolenausgabe erzeugt, wenn es remote mit „Invoke-Command“ ausgeführt wird. Ich musste die Ausgabe in eine Datei umleiten und dann die Datei lesen. Gibt es einen besseren Weg?

Antwort1

Ich würde versuchen, es an das Cmdlet „tee-object“ weiterzuleiten und Ihre Datei dann bei Bedarf dort zu speichern (ich weiß nicht, ob es funktionieren würde, die Dateiausgabe an $null zu senden. Schade, dass dies kein Linux ist und wir sie an /dev/null senden könnten, aber ich schweife ab).

Dies ist das tee-object Cmdlethttp://technet.microsoft.com/en-us/library/ee177014.aspx

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait | tee-object -file c:\output.txt} -ArgumentList $prog,$arg

das ist ungetesteter Code, aber das ist im Allgemeinen, was Sie wollen.

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait | tee-object -file $null} -ArgumentList $prog,$arg

könnte auch funktionieren.

verwandte Informationen