该脚本相当简单。只需尝试启动一堆 Windows 服务。在目标机器上本地执行时工作正常。通过 PsExec 执行时,该脚本实际上执行得很好,只是在我按下 CMD 提示符上的“enter”键之前它永远不会返回。这是一个问题,因为它是从 TeamCity 调用的,它使代理挂起等待 PsExec 返回。
我尝试了以下方法:
- 在 Powershell 脚本末尾添加
exit
andexit 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
将工作。
答案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
也修复了该问题。
这-d
psexec 标志就像以非交互方式“运行并退出”:
-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%