剧本相当简单。 只是试图开始一堆的Windows服务。 在目标机器上执行本地工作正常。 当通过PsExec完成时,脚本实际上执行得很好,直到我在我的CMD提示符上点击“enter”键,它才会返回。 这是一个问题,因为这是从TeamCity中调用的,并且它使代理挂起等待PsExec返回。
我已经尝试了以下内容:
exit并exit 0 Powershell脚本的末尾exit 0 < NUL添加到PsExec调用的末尾 > stdoutredirect 这就是我实际调用psexec的方式:
psexec \\target -u domain\username -p password powershell c:\path\script.ps1
无论我做什么,它都会挂起,直到我在本地的cmd提示符下。 在我进入后,我收到消息:
powershell exited on target with error code 0.
原来这是一个普遍的问题。 在这里find解决scheme。 从本质上讲,如果你用cmd在stdin上pipe理一些数据,它会在执行后返回properties(因为它是通过cmd运行的,而不是powershell)。
例:
psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
我知道答案来得迟,这已经被计算出来了,如果不是这样的话,对未来的访问者可能是有用的。
STDIN必须在powerhell执行中重新定向以便能够来自hang(在STDIN中等待)。 能够做到这一点使用-inputformat none
powershell -inputformat none -File powershell_script.ps1将工作。
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1
也解决了这个问题。
psexec的-d标志与非交互式的“运行和退出”类似:
-d不要等待应用程序终止。
仅用于非交互式应用程序。
Powershell不退出。 试试这个命令行
Powershell -command script.ps1