成功运行Powershell脚本后,为什么PsExec挂起?


12

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

我尝试了以下方法:

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

这就是我实际上打电话给psexec的方式:

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

无论我做什么,它都将挂起,直到我在本地出现在cmd提示符下为止。点击回车后,我收到消息:

powershell exited on target with error code 0.

Answers:


11

原来这是一个普遍的问题。在这里找到解决方案。本质上,如果您使用cmd用管道传输stdin上的某些数据,它将在执行后正确返回(因为它是通过cmd而不是powershell运行的)。

例:

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

是设置为“命令行-自定义脚本”还是“命令行-可执行文件”(在TeamCity中)?
Wojtek Turowicz

好的,我已经将其设置为可执行文件,它有所帮助。谢谢队友,我已经花了1天的时间对其进行诊断。传播这个词!
Wojtek Turowicz

一天后,问题又出现了……
Wojtek Turowicz

11

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

为了能够挂起,必须在powershell执行中将STDIN重定向(在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


这不仅有效,而且还解释了为什么接受的答案有效。谢谢!
jpaugh

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

也解决了问题。

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

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

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


0

Powershell没有退出。试试这个命令行

Powershell -command script.ps1

0

我正在psexec使用VBS脚本运行,并且标记为最佳的解决方案(EX:)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%
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.