
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.