Hauptfrage

Hauptfrage

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.";
}

$commandsEs 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 foooder hinzugefügt deploy FS -src "data". Diese sind manchmal schwer zu merken. Dazu habe ich zwei kleine Fragen: (1) Wo sind meine Write-OutputDaten? Und (2) was ist das für ein komisches CLIXMLDing (scheint laut Google „spezielles“ Powershell-XML zu sein)? Wenn ich exitdas 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 $commandsObjekt (also auch die Write-OutputDaten) korrekt ausführen?

Ich habe bereits versucht, Invoke-Commanddas 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 ...

ps Wahnsinn


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

verwandte Informationen