web-dev-qa-db-ja.com

PowerShellスクリプトを正常に実行した後にPsExecがハングするのはなぜですか?

スクリプトはかなり単純です。一連のWindowsサービスを開始しようとするだけです。ターゲットマシン上で実行すると、ローカルで正常に動作します。 PsExecを介して実行した場合、スクリプトも実際には問題なく実行されています。CMDプロンプトで「Enter」キーを押すまで、スクリプトが戻ることはありません。これはTeamCityから呼び出されているため問題であり、PsExecが戻るのを待ってエージェントがハングします。

私は以下を試しました:

  • Powershellスクリプトの最後にexitおよび_exit 0_を追加する
  • このSFの質問の回答に従って、PsExec呼び出しの最後に_< NUL_を追加する-)
  • _>_ stdoutリダイレクトの追加

これは私が実際にpsexecを呼び出す方法です:

_psexec \\target -u domain\username -p password powershell c:\path\script.ps1
_

私が何をしても、ローカルでcmdプロンプトが表示されるまでハングします。 Enterキーを押すと、次のメッセージが表示されます。

_powershell exited on target with error code 0.
_
12
Matt

これは一般的な問題であることがわかりました。ソリューションa here が見つかりました。基本的に、cmdを使用してstdinにデータをパイプすると、データは実行後に適切に返されます(Powershellではなくcmdを介して実行されているため)。

例:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
11
Matt

私は答えが遅れて来ることを知っています、それはすでに理解されているでしょう、もしそうでなければ、それは将来の訪問者にとって役に立つかもしれません。

STDINは、ハングから復帰できるようにPowerShell実行でリダイレクトする必要があります(ここでは、STDINで待機しています)。これを使用できるようにするには-inputformat none

powershell -inputformat none -File powershell_script.ps1 動作します。

チェック- https://connect.Microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected

11
Venfah Nazir
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

また、問題を修正します。

-d psexecのフラグ は、非対話的な方法で「実行して終了」のようなものです。

-dアプリケーションが終了するのを待ちません。

非インタラクティブアプリケーションでのみ使用します。

5
riogezz

Powershellが終了していません。このコマンドラインを試してください

Powershell -command script.ps1
0
uSlackr

私はVBSスクリプトとpsexecを実行しており、ソリューションは最高とマークされました(EX:psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1")は、3回ほど実行するたびにのみ機能しました。私は掘り続けていて、私は 各スイッチの説明 を見つけました

私は "-s"を試してみることにしました。それは毎回私のためにうまくいったことですここに私の例があります:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
0
Thomas