无法启动或执行新的窗口或应用程序在远程系统上使用Windows PowerShell的“命令”

l2osamch  于 7个月前  发布在  Windows
关注(0)|答案(1)|浏览(60)

在Windows PowerShell(admin)中:

连接远程Windows

第一个月

尝试远程执行

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文件。
我尝试远程执行命令,并期望启动新的窗口或应用程序,但这并没有发生。

vaj7vani

vaj7vani1#

  • 从根本上说,无论是否是远程的,很少有理由使用Start-Process来调用外部程序,特别是如果它们是控制台应用程序。
    要在同一个窗口中同步 * 调用后者 ,并将其标准流连接到PowerShell的流,* 直接调用它们 *(例如& "C:\Path\MyProgram.exe"
  • 有关Start-Process适用和不适用的指导,请参见GitHub docs issue #6239
  • 在PowerShell remoting的上下文中,还有其他陷阱:
  • 假设Start-Process默认创建一个 * 新窗口 *,则该窗口在远程会话中不可见。
  • 此外,默认情况下执行是异步的(在本地调用中也是如此)。
  • 虽然你可以让-Wait的调用 * 同步 *,但在远程处理中,试图让-NoNewWindow也在同一个窗口 * 中运行 * 是行不通的:你不会看到任何输出(在本地调用中,你会看到输出,但你无法 * 捕获 * 它;这就是为什么 * 直接 * 调用更可取的原因)。
  • 最后,PowerShell的远程处理不 * 支持 * 交互式 * 控制台应用程序
    • 结果**是:
  • 假设"C:\Path\MyProgram.exe"是一个控制台应用程序,在远程会话中使用直接调用(由于语法原因,需要调用操作符&,因为您的可执行路径是 * 加引号的 *):
& "C:\Path\MyProgram.exe"

字符串

  • 但是,您尝试在没有/C和特定命令 * 的情况下运行cmd *,即尝试启动 * 交互式 * 会话无法工作(cmd.exe进程启动并立即悄悄退出)。
    远程运行 * 交互式 * 控制台应用程序的选项
  • 您可以通过内置的**winrs.exeCLI使用Windows远程管理**,该CLI支持交互式控制台应用程序。Windows远程管理使用与PowerShell远程处理相同的基础结构(WSMan/WinRM),因此它可能适用于启用了PowerShell远程处理的目标计算机;有关设置信息,请参阅the docs
# Enter an interactive session on computer "yourcomputer"
winrs -r:yourcomputer cmd

  • 注意事项:
  • 您甚至可以通过这种方式启动交互式 PowerShell 会话(winrs -r:yourcomputer cmd
  • 传递给winrs.exe的任何可执行文件(如果需要,还可以加上参数)都通过(cmd /c)隐式执行。
    或者您也可以下载使用*psexec**,它也支持交互式控制台应用程序,但使用不同的远程机制,具有许多高级功能。

相关问题