web-dev-qa-db-ja.com

バッチ(.cmd)ファイルを介してPSEXECで呼び出されたときにPowerShellスクリプトがハングするのはなぜですか?

PSEXECを使用してPowerShellスクリプトをリモートで実行しようとしています。 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バッチファイルでこれを試しましたが、問題なく動作します。

RDPセッションを介してリモートサーバーでdo-tasks.cmdを実行しても問題ありません。

発信元サーバーはWindows2003 SP2を実行しており、リモートサーバーはWindows 2008SP2を実行しています。

PSEXECを介して実行すると、リモートバッチファイルがスタックするのはなぜですか?

4
Kev

サーバーは2k8を実行しているので、UACが問題を引き起こしているのではないかと思います。また、psexecの代わりにwinrmを使用することをお勧めします。 Powershell Remotingは、PowerShell2.0の最高の新機能の1つでした。

0
Jim B

これはPOSHの一般的な問題です。問題はstdinがハングすることです。これを試して:

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

フォーラムの回答のほとんどは、エコーやパイピングなどの回避策でこれを解決し、PowershellがSTDINから何らかの入力を受け取るようにします。

しかし、PowerShell内には解決策があります。オプション-inputformatでpowershellを起動するだけです。

powershell -inputformat none -command ...

これにより、Win2003およびWin2008のpsexecを介したハングの問題が解決されます。

5
Walter Ebner