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

Kev*_*Kev 4 remote-access windows powershell pstools

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

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

powershell -command "&{ set-executionpolicy unrestricted}"  
powershell DoTasks.ps1  
powershell -command "&{ set-executionpolicy restricted}"  
Run Code Online (Sandbox Code Playgroud)

PowerShell 脚本DoTasks.ps1现在只是这样做:

Write-Output "Hello World!"
Run Code Online (Sandbox Code Playgroud)

这两个脚本都存在于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

小智 11

这是 POSH 的常见问题。问题是stdin挂起。尝试这个:

c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}" < NUL
Run Code Online (Sandbox Code Playgroud)


小智 5

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

但是在powershell中存在一个解决方案。只需使用选项 -inputformat none 启动 powershell,例如:

powershell -inputformat none -command ...
Run Code Online (Sandbox Code Playgroud)

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