【问题标题】:Powershell closes on executing exePowershell在执行exe时关闭
【发布时间】:2019-03-19 21:00:48
【问题描述】:

我正在尝试在 C:programfiles(x86) 中运行和 .exe 我可以直接从文件路径启动它。如果我在 powershell 中运行就会关闭。没有反馈。

运行 powershell 5.1.17134 Rev 590

Start-Process -FilePath "C:\Program Files (x86)\App\App.exe"

我尝试运行 powershell -NoExit 然后启动进程,但它返回时没有任何反馈。

如果我在 Powershell 6.1.0 预览版的同一台机器上运行它 - 它运行良好。没有任何问题。我如何追踪导致此问题的原因 1)不运行 2)关闭 powershell。 谢谢,

【问题讨论】:

标签: powershell


【解决方案1】:

这个答案提出了一个普遍的观点。如果使用 Start-Process 确实使调用 PowerShell 窗口崩溃,它并不能解决您的问题。


如果C:\Program Files (x86)\App\App.exe 是一个控制台应用程序,您希望在当前控制台窗口中运行,请不要使用Start-Process 来调用它。

相反,直接调用它

鉴于其路径包含空格和特殊字符(()),您需要:

  • 引用它

  • 使用 &(PowerShell 的 call operator)调用它。

PS> & 'C:\Program Files (x86)\App\App.exe'

注意:

  • 考虑到 PowerShell 有两种不同的解析模式 - 请参阅 about_Parsing

直接调用控制台应用程序:

  • 确保其同步执行

    • 也就是说,在应用程序终止之前,控制权不会返回给调用者。
  • 将其标准输出流 - stdout 和 stderr - 连接到等效的 PowerShell 流。

    • 也就是说,您可以根据需要捕获或重定向应用程序的成功输出和/或错误输出。

【讨论】:

    【解决方案2】:

    您有一个交互式外壳。你产生了这个新进程 - 然后你的 shell 关闭了?

    很明显它正在终止它的父进程,而且很明显pwsh 正在做一些不同的事情。

    我不认为这是一个真正的 powershell 问题,它是一个 Windows 内部问题。要使用的工具套件是 Sysinternals。我要尝试的第一件事——我会在cmdpowershellpwsh 上执行此操作以建立比较基础——在您的应用程序路径上运行带有过滤器的 Process Monitor。它最后的行动可能会证明是有启发性的。 Process Explorer 也可能有用。

    您在公司环境中吗?我的机器上有基于启发式终止进程的代理。这可以做这样的事情。

    根据您调用应用程序的方式,可能会有一种解决方法;

    • 试试 mklement0 的建议
    • 尝试通过 WMI 调用;这不会将您的 powershell 进程作为父进程提供:Invoke-WmiMethod -Class win32_process -Name create -ArgumentList "PathToApp.exe"
    • 如果您受到目标计算机上的限制,请尝试通过 cmd.exe 调用

    不过,我确实认为这是题外话。

    【讨论】:

    • 做得很好。我的回答对频繁的反模式提出了一般性观点,但它可能不适合 OP 的实际问题 - 我添加了一个注释来指出这一点。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-02-15
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多