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

Mat*_*att 15 powershell pstools

剧本相当直接。只是尝试启动一堆 Windows 服务。在目标机器上执行本地工作正常。当通过 PsExec 完成时,该脚本实际上也能正常执行,直到我在 CMD 提示符下按“回车”键,它才会返回。这是一个问题,因为这是从 TeamCity 调用的,它使 Agent 挂起,等待 PsExec 返回。

我尝试了以下方法:

  • 在 Powershell 脚本的末尾添加exitexit 0
  • < NUL根据此 SF 问题中的答案,在 PsExec 调用的末尾添加一个
  • 添加>标准输出重定向

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

psexec \\target -u domain\username -p password powershell c:\path\script.ps1
Run Code Online (Sandbox Code Playgroud)

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

powershell exited on target with error code 0.
Run Code Online (Sandbox Code Playgroud)

Ven*_*zir 12

我知道答案来晚了,它本来已经被弄清楚了,否则它可能对未来的访问者有用。

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


Mat*_*att 11

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

例子:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
Run Code Online (Sandbox Code Playgroud)


小智 5

psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1
Run Code Online (Sandbox Code Playgroud)

也解决了问题。

-dpsexec标志类似于以非交互方式“运行并退出”:

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

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