为什么通过批处理(.cmd)文件在 PSEXEC 中调用我的 PowerShell 脚本时会挂起?

为什么通过批处理(.cmd)文件在 PSEXEC 中调用我的 PowerShell 脚本时会挂起?

我正在尝试使用 远程执行 PowerShell 脚本PSEXEC。PowerShell 脚本通过批处理文件调用.cmd。我们这样做的原因是更改执行策略,运行 powershell 脚本,然后再次重置执行策略:

在远程服务器上do-tasks.cmd看起来像:

powershell -command "&{ set-executionpolicy unrestricted}"  
powershell DoTasks.ps1  
powershell -command "&{ set-executionpolicy restricted}"  

PowerShell 脚本DoTasks.ps1目前只执行此操作:

Write-Output "Hello World!"

这两个脚本c:\windows\system32目前都存在于 PATH 中。

在原始服务器上我执行以下操作:

psexec \\web1928 -u administrator -p "adminpassword" do-tasks.cmd

运行时我在命令行收到以下响应:

c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}"

并且脚本不再运行。

我无法使用 ctrl-c 来中断脚本,我只看到 ^C 字符,我可以从键盘输入内容,并且这些字符会回显到控制台。

在远程服务器上,我看到 PowerShell.exe 和 CMD.exe 正在任务管理器的“进程”选项卡中运行。如果我结束这些进程,则控制权将返回到原始服务器上的命令行。

我已经尝试使用一个简单的.cmd批处理文件来实现这一点,@echo hello world并且它运行良好。

do-tasks.cmd通过 RDP 会话在远程服务器上运行也可以正常工作。

原始服务器运行的是 Windows 2003 SP2,远程服务器运行的是 Windows 2008 SP2。

为什么我的远程批处理文件在通过执行时会卡住PSEXEC

答案1

由于服务器运行的是 2k8,我怀疑 UAC 导致了问题。我还建议使用 winrm 而不是 psexec。Powershell 远程处理是 powershell 2.0 最好的新功能之一

答案2

这是 POSH 的常见问题。问题stdin挂起了。尝试以下操作:

c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}" < NUL

答案3

论坛中的大多数答案都通过回显和管道等变通方法来解决这个问题,以便 powershell 从 STDIN 获取一些输入。

但是 powershell 中有一个解决方案。只需使用选项 -inputformat none 启动 powershell,如下所示:

powershell -inputformat none -command ...

这解决了 Win2003 和 Win2008 通过 psexec 出现的挂起问题。

相关内容