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

问题描述 投票:0回答:1

在 Windows Powershell(管理员)中:

连接到远程Windows

$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 文件。

我尝试远程执行命令并期望启动新窗口或应用程序,但这并没有发生。

windows powershell powershell-remoting invoke-command remote-execution
1个回答
0
投票
  • 从根本上来说 - 无论是否远程 - 很少有充分的理由使用

    Start-Process
    来调用 外部程序,特别是如果它们是 控制台 应用程序。

    • 同步调用后者在同一窗口中,将其标准流连接到 PowerShell 的流,直接调用它们(例如

      "C:\Path\MyProgram.exe"

    • 有关

      Start-Process
      何时合适以及何时不合适的指导,请参阅 GitHub 文档问题 #6239

  • 在PowerShellremoting的较量中,还有额外的陷阱:

    • 鉴于

      Start-Process
      默认创建一个新窗口,该窗口在远程会话中将不可见。

    • 此外,默认情况下执行是异步(也在本地调用中)。

    • 虽然您可以使用-Wait进行调用

      同步
      ,但尝试在同一个窗口中使用-NoNewWindow运行
      在远程处理中不起作用:您不会看到任何输出(在本地调用中) ,您将看到输出,但无法捕获它;这就是为什么直接调用更可取)。
      
      

  • 最后,PowerShell 的远程处理
  • 支持交互式控制台应用程序。


结果

是:

    假设
  • "C:\Path\MyProgram.exe"

    是一个控制台应用程序,请在远程会话中使用直接调用(

    &
    调用运算符
    ,由于语法原因是需要的,因为您的可执行路径是引用): & "C:\Path\MyProgram.exe"

  • 但是,您尝试在没有
  • cmd

    /C
    的情况下运行
    /K
    ,即启动 
    interactive
    会话无法工作(cmd.exe 启动,然后立即安静地退出)。
    
    

远程运行交互式控制台应用程序的选项

您可以通过内置
© www.soinside.com 2019 - 2024. All rights reserved.