![Hauptfrage](https://rvso.com/image/1558694/Hauptfrage.png)
Ich kämpfe mit etwas, das eigentlich ganz einfach sein sollte, aber nicht so einfach zu lösen scheint. Ich muss eine dynamische Folge von Powershell-Befehlen ausführen. Das ist Teil einer Vorlage, die ich für mich selbst geschrieben habe, um meinen Arbeitsablauf zu vereinfachen.
Hier ist ein einfaches Beispiel für einen generierten Gruppenbefehl:
$commands = {
Write-Output "Navigating to tools->deploy";
Set-Location "C:\tools\deploy\";
Write-Output "OK. Run dd.ps1 [server name] to deploy.";
}
$commands
Es ist möglich, dies mithilfe von auszuführen Invoke-Command
. Letztendlich habe ich also diese Funktion, die das erledigt:
function invokeNow() {
param([string]$c)
Invoke-Command $c;
}
Das funktioniert gut. Es führt die Befehle im Objekt im Fenster aus. Aber mit der Zeit habe ich weitere Funktionen hinzugefügt. Für jede neue Anweisung muss ich jedes Mal Powershell öffnen... Das liegt daran, dass ich manchmal, wenn ein Skript ausgeführt wird, keine andere Funktion ausführen kann. Mein Ziel ist es jetzt also, die obige Befehlsgruppe in einemneuFenster, sodass ich dasselbe Shell-Fenster verwenden kann, um mehrere Aufgaben aufzurufen (die in ihren eigenen Fenstern ausgeführt werden). Ich dachte, das wäre einfach, also änderte ich die Funktion zu
function invokeNow() {
param([string]$c)
Invoke-Expression "cmd /c start powershell -Command {$c} -NoProfile -NoExit";
}
Das führt zu diesem Ergebnis:
#< CLIXML
#< CLIXML
PS C:\tools\deploy\>
Die Navigation hat funktioniert. Allerdings sind meine Ausgabeinformationen verloren gegangen. Einige Befehle haben Anweisungen wie deploy S1 foo
oder hinzugefügt deploy FS -src "data"
. Diese sind manchmal schwer zu merken. Dazu habe ich zwei kleine Fragen: (1) Wo sind meine Write-Output
Daten? Und (2) was ist das für ein komisches CLIXML
Ding (scheint laut Google „spezielles“ Powershell-XML zu sein)? Wenn ich exit
das Fenster schließe, sehe ich eine Menge XML-Zeug, bevor das Fenster geschlossen wird.
Hauptfrage
Ist es möglich, ein neues Powershell-Fenster zu öffnen,Danndie Befehle in meinem $commands
Objekt (also auch die Write-Output
Daten) korrekt ausführen?
Ich habe bereits versucht, Invoke-Command
das Obige zu ergänzen, wie
Invoke-Expression "cmd /c start powershell -Command {Invoke-Command -ScriptBlock $c} -NoProfile -NoExit";
aber das neue Fenster spuckt eine Menge XML-Zeug aus ...
Versions Information
PS C:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.16299.251
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.16299.251
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1