我正在尝试启动PowerShell窗口,该窗口使用以下命令启动ssh会话:pwsh.exe -noexit -Command {ssh <username>@<host>}
这在从pwsh.exe窗口本身执行时有效:
,但当从cmd、运行窗口(Win+R)或任务计划程序(我需要它的目的)执行时,它只显示应该执行的命令并启动pwsh:
也就是说,在PowerShell*之外不起作用的命令是:
pwsh.exe -noexit -Command {ssh username@host}
当然,这些命令已经在实际网站上进行了测试,在这些网站上,1可以工作,2不能工作。
如有任何帮助,将不胜感激!谢谢!
3条答案
按热度按时间eanckbw91#
问题是,我使用的花括号显然在cmd中不起作用,但在pwsh中起作用。要使该命令在CMD中起作用,只需使用双引号:
pwsh.exe -noexit -Command "ssh username@host"
p8h8hvxi2#
请参见pwsh documentation中的
-Command
参数。Cmd.exe不知道scriptBlock概念,并将{ssh test@test}
解释为字符串。当从cmd.exe触发pwsh.exe时,您应该这样做:
ldxq2e6h3#
注:
powershell.exe
适用于Windows PowerShell,pwsh
适用于PowerShell (Core) 7+)powershell -Command "& { ... }"
/pwsh -Command "& { ... }"
是反模式,因此要避免:"..."
,而不是"& { ... }"
,即直接指定所有命令,[1],避免不必要的语法仪式和不必要的处理(尽管后者在实践中无关紧要)。& { ... }
,但后来已更正了这一点。tl;dr
pwsh { ... }
**(隐含-Command
);在您的案例中:ssh username@host
。pwsh -Command " ... "
**(或pwsh -c " ..."
);在您的情况下(如your own answer):**外部*可以表示:
cmd.exe
"
字符而变得棘手。转义为\"
-请参见this answer以了解可靠的解决方法。Run
对话框(WinKey+R)和任务调度器启动的命令。"..."
),但如果您从Unix*(POSIX兼容)外壳程序(如Bash)调用,单引号也是一个选项。有关PowerShell CLI的全面概述,请参阅this post。
背景资料:
{ ... }
是PowerShell script block的字面形式,粗略地说是一段必须*按需调用的可重用代码,可以使用&
(在子作用域中),也可以使用.
(直接在调用者的作用域中):{ ... }
作为语法糖*:-EncodedCommand
构造的命令行上传递;类似地,传递给-Args
的任何参数都是Base64编码的,并通过-EncodedArguments
传递,并通过-OutputFormat XML
请求CLIXML(PowerShell基于XML的进程间序列化格式)作为输出格式{
和}
。Get-Date
,您也可以从PowerShell内部按如下方式进行验证:{ Get-Date }.ToString()
[1][1]从技术上讲,如果您想要将参数从您的命令字符串内部传递到嵌入的脚本块,您可以使用
"& { ... } ..."
,尽管在实践中很少需要这种级别的封装;一个特制的例子(从PowerShell外部调用):pwsh -c "& { 'Time is now: ' + $args[0].TimeOfDay } (Get-Date)"