在 Windows Powershell(管理员)中:
$session = New-PSSession -ComputerName "xx.xx.xx.xx"
Invoke-Command -Session $session -ScriptBlock {
cd C:\Path
ls
Start-Process -FilePath "C:\Path\MyProgram.exe"
start-Process cmd
}
cd 和 ls 命令按预期工作,但 Start-Process cmd 和 MyProgram.exe 未启动。没有窗口出现;好像被跳过了。
我还尝试了另一种方法:
PS C:\Jenkins> Enter-PSSession -Session $session
[xx.xx.xx.xx]: PS C:\Users\Administrator\Documents> Start-Process cmd
[xx.xx.xx.xx]: PS C:\Users\Administrator\Documents> (nothing happens)
两种方式都无法启动或执行新窗口或 .exe 文件。
我尝试远程执行命令并期望启动新窗口或应用程序,但这并没有发生。
Start-Process
来调用 外部程序,特别是如果它们是 控制台 应用程序。
要同步调用后者在同一窗口中,将其标准流连接到 PowerShell 的流,直接调用它们(例如
"C:\Path\MyProgram.exe"
)
有关
Start-Process
何时合适以及何时不合适的指导,请参阅 GitHub 文档问题 #6239
在PowerShellremoting的较量中,还有额外的陷阱:
鉴于
Start-Process
默认创建一个新窗口,该窗口在远程会话中将不可见。
此外,默认情况下执行是异步(也在本地调用中)。
虽然您可以使用-Wait
进行调用
同步,但尝试在同一个窗口中使用
-NoNewWindow
运行在远程处理中不起作用:您不会看到任何输出(在本地调用中) ,您将看到输出,但无法捕获它;这就是为什么直接调用更可取)。
支持交互式控制台应用程序。
是:
"C:\Path\MyProgram.exe"
是一个控制台应用程序,请在远程会话中使用直接调用(
&
,调用运算符,由于语法原因是需要的,因为您的可执行路径是引用):
& "C:\Path\MyProgram.exe"
cmd
或
/C
的情况下运行 /K
,即启动interactive 会话无法工作(
cmd.exe
启动,然后立即安静地退出)。
您可以通过内置
winrs.exe
CLI 使用 Windows 远程管理
,它支持交互式控制台应用程序。 Windows 远程管理使用与 PowerShell 远程处理相同的基础架构 (WSMan/WinRM),因此它很可能适用于启用 PowerShell 远程处理的目标计算机;请参阅文档了解设置信息。
# Enter an interactive session on computer "yourcomputer"
winrs -r:yourcomputer cmd
注意:
winrs -r:yourcomputer cmd
)
您传递给
winrs.exe
cmd /c
) 隐式执行。
,它也支持交互式控制台应用程序,但使用不同的远程机制。