主要問題

主要問題

我正在努力解決一些本來應該很簡單但似乎不太容易解決的問題。我有一個動態的 powershell 命令序列要運行。它是我為自己編寫的一些模板的一部分,以使我的工作流程更加輕鬆。

這是產生的分組命令的簡單範例:

$commands = {
  Write-Output "Navigating to tools->deploy";
  Set-Location "C:\tools\deploy\";
  Write-Output "OK. Run dd.ps1 [server name] to deploy.";
}

可以$commands使用 來運行它Invoke-Command。所以最終我有了這個處理它的函數:

function invokeNow() {
  param([string]$c)
  Invoke-Command $c;
} 

這很好用。它執行視窗中物件中的命令。但隨著時間的推移,我為它添加了更多功能。對於每個新指令,我每次都必須打開 powershell...那是因為有時,當腳本運行時我無法發出另一個函數。所以,我現在的目標是在新的窗口,以便我可以使用同一個 shell 窗口來呼叫多個任務(在它們自己的窗口中運行)。我認為這會很簡單,所以我將函數更改為

function invokeNow() {
  param([string]$c)
  Invoke-Expression "cmd /c start powershell -Command {$c} -NoProfile -NoExit";
} 

這導致了這個結果:

#< CLIXML
#< CLIXML
PS C:\tools\deploy\>

導航確實有效。但是,我的輸出資訊丟失了。有些命令添加了deploy S1 foo或等指令deploy FS -src "data"。這些有時很難記住。為此,我有兩個小問題:(1)我的Write-Output資料在哪裡? (2)那個奇怪的CLIXML東西是什麼(根據Google的說法似乎是「特殊的」powershell XML)?當我exit關閉該視窗時,我在視窗關閉之前看到了一堆 XML 內容。

主要問題

是否可以開啟一個新的powershell窗口,然後正確執行我的物件中的命令$commands(從而包括Write-Output資料)?

我已經嘗試添加Invoke-Command到上面的內容中,例如

Invoke-Expression "cmd /c start powershell -Command {Invoke-Command -ScriptBlock $c} -NoProfile -NoExit";

但是新視窗會吐出很多 XML 內容...

瘋狂PS


版本資訊

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

相關內容