我正在尝试使用 远程执行 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 出现的挂起问题。