为什么成功运行 powershell 脚本后 PsExec 会挂起?

为什么成功运行 powershell 脚本后 PsExec 会挂起?

该脚本相当简单。只需尝试启动一堆 Windows 服务。在目标机器上本地执行时工作正常。通过 PsExec 执行时,该脚本实际上执行得很好,只是在我按下 CMD 提示符上的“enter”键之前它永远不会返回。这是一个问题,因为它是从 TeamCity 调用的,它使代理挂起等待 PsExec 返回。

我尝试了以下方法:

  • 在 Powershell 脚本末尾添加exitandexit 0
  • < NUL根据答案,在 PsExec 调用的末尾添加一个这个科幻问题
  • 添加>stdout 重定向

这就是我实际调用 psexec 的方式:

psexec \\target -u domain\username -p password powershell c:\path\script.ps1

无论我做什么,它都会挂起,直到我在本地的 cmd 提示符下。按下回车键后,我收到消息:

powershell exited on target with error code 0.

答案1

我知道答案来得晚了,但可能早就有人知道了,如果没有,它可能对未来的访客有用。

为了能够从挂起状态(此处它在 STDIN 中等待),必须在 powershell 执行中重定向 STDIN。要做到这一点,请使用 -inputformat none

powershell -inputformat none -File powershell_script.ps1将工作。

查看 -https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected

答案2

事实证明这是一个常见问题。找到了解决方案这里本质上,如果您使用 cmd 在 stdin 上传输一些数据,它将在执行后正确返回(因为它是通过 cmd 运行的,而不是 powershell)。

例子:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"

答案3

psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

也修复了该问题。

-dpsexec 标志就像以非交互方式“运行并退出”:

-d 不要等待应用程序终止。

仅适用于非交互式应用程序。

答案4

我使用 VBS 脚本运行psexec,标记为最佳的解决方案(例如psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1":)仅在每 3 次左右的运行中对我有效。我继续挖掘,发现每个开关的描述

我决定尝试“-s”,而且每次都有效这是我的示例:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%

相关内容