我正在嘗試使用以下命令啟動一個 ssh 會話的 Powershell 視窗:
pwsh.exe -noexit -Command {ssh <username>@<host>}
這在從 pwsh.exe 視窗本身
執行時有效:但是當從 cmd、運行視窗 (Win R) 或任務計劃程式(我需要它)執行時,它只顯示應該執行的命令并啟動 pwsh :

也就是說,在PowerShell之外不起作用的命令是:
pwsh.exe -noexit -Command {ssh username@host}
這些命令當然已經在實際網站上進行了測驗,其中 1 個有效而 2 個無效。
任何幫助將不勝感激!謝謝!
uj5u.com熱心網友回復:
問題是我使用了在 cmd 中顯然不起作用但在 pwsh 中起作用的花括號。要使命令在 CMD 中作業,只需使用雙引號:
pwsh.exe -noexit -Command "ssh username@host"
uj5u.com熱心網友回復:
請參閱pwsh 檔案-Command中的引數。cmd.exe 不知道ScriptBlock概念并解釋為字串。{ssh test@test}
從 cmd.exe 觸發 pwsh.exe 時,您應該執行以下操作:
pwsh.exe -noexit -Command "& {ssh test@test}"
uj5u.com熱心網友回復:
筆記:
下面的答案適用于兩個PowerShell 版本的 CLI ,(
powershell.exe對于 Windows PowerShell,pwsh對于PowerShell (Core) 7 )powershell -Command "& { ... }"/pwsh -Command "& { ... }"是一種反模式,因此要避免:使用
"...", not"& { ... }",即直接指定所有命令, [1]這避免了不必要的句法儀式和不必要的處理(盡管后者在實踐中并不重要)。不幸的是,這種反模式很常見,可能是因為舊版本的 CLI 檔案(請參閱上面的鏈接)錯誤地建議這
& { ... }是必需的,但這已經得到糾正。
tl;博士
從PowerShell內部,使用
pwsh { ... }(-Command隱含);在你的情況下:pwsh.exe -noexit { ssh username@host }- 但是,請注意很少需要從 PowerShell 內部呼叫 PowerShell CLI(這涉及創建子行程)。
ssh username@host在這里您可以直接呼叫.
- 但是,請注意很少需要從 PowerShell 內部呼叫 PowerShell CLI(這涉及創建子行程)。
從外部PowerShell,使用
pwsh -Command " ... "(orpwsh -c " ..."); 在您的情況下(如您自己的答案):pwsh.exe -noexit "ssh username@host"- 外面可能意味著:
- 從另一個 shell呼叫,特別是
cmd.exe- 從另一個 shell 呼叫意味著必須首先滿足其
"語法要求,這對于chars 可能會變得棘手。被轉義為\"- 請參閱此答案以獲得強大的解決方法。
- 從另一個 shell 呼叫意味著必須首先滿足其
- 從非 shell背景關系呼叫,例如 Windows
Run對話框 ( WinKey R) 和任務計劃程式啟動的命令。 - Windows上的所有(本機)外部背景關系都需要雙引號 (
"..."),但如果您從Unix(POSIX 兼容)shell(如 Bash)呼叫,單引號也是一種選擇。
- 從另一個 shell呼叫,特別是
- 外面可能意味著:
有關PowerShell CLI 的全面概述,請參閱這篇文章。
背景資料:
{ ... }是 PowerShell腳本塊的字面形式,松散地說是一段可重用的代碼,必須按需呼叫,無論是&(在子范圍內)還是.(直接在呼叫方范圍內):
只有在PowerShell內部,它才能與 PowerShell CLI 一起使用以傳遞要執行的命令,因為 PowerShell 提供
{ ... }了語法糖:- 在幕后,腳本塊內的代碼是 Base64 編碼的,并在最終通過
-EncodedCommand;構造的命令列上傳遞。類似地,傳遞給的任何引數-Args都是 Base64 編碼并通過 傳遞-EncodedArguments,并且 CLIXML(PowerShell 的基于 XML 的行程間序列化格式)被請求為輸出格式-OutputFormat XML - 這與接收到的輸出的自動反序列化相結合,可確保盡可能保留 PowerShell 豐富(基于 .NET)型別系統和多個輸出流的優勢(涉及序列化時型別保真度具有固有限制)。
- 在幕后,腳本塊內的代碼是 Base64 編碼的,并在最終通過
當從外部呼叫 PowerShell CLI (甚至通過PowerShell 內部的字串)時,語法糖不適用,并且腳本塊文字(總是通過字串引數提供)被決議為:一段代碼稍后再呼叫。
因此,如果您嘗試以下操作:
# !! WRONG - simply *prints* what's between { and } # (Also applies if you don't use "..." from outside PowerShell.) pwsh -c "{ Get-Date }"- PowerShell 構造一個腳本塊,并且由于它沒有分配給變數,因此默認輸出它,這意味著(否則未使用的)腳本塊列印的字串表示,這是腳本塊的逐字內容,sans
{和}. - 也就是說,逐字
Get-Date列印,您也可以從 PowerShell 內部進行如下驗證:{ Get-Date }.ToString()
- PowerShell 構造一個腳本塊,并且由于它沒有分配給變數,因此默認輸出它,這意味著(否則未使用的)腳本塊列印的字串表示,這是腳本塊的逐字內容,sans
[1]從技術上講,"& { ... } ..."如果您想將命令字串中的引數傳遞給嵌入式腳本塊,則可以使用,盡管在實踐中很少需要這種級別的封裝;一個人為的例子(從 PowerShell 外部呼叫):
pwsh -c "& { 'Time is now: ' $args[0].TimeOfDay } (Get-Date)"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521948.html
