スクリプトはかなり単純です。一連のWindowsサービスを開始しようとするだけです。ターゲットマシン上で実行すると、ローカルで正常に動作します。 PsExecを介して実行した場合、スクリプトも実際には問題なく実行されています。CMDプロンプトで「Enter」キーを押すまで、スクリプトが戻ることはありません。これはTeamCityから呼び出されているため問題であり、PsExecが戻るのを待ってエージェントがハングします。
私は以下を試しました:
exit
および_exit 0
_を追加する< 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.
_
これは一般的な問題であることがわかりました。ソリューションa here が見つかりました。基本的に、cmdを使用してstdinにデータをパイプすると、データは実行後に適切に返されます(Powershellではなくcmdを介して実行されているため)。
例:
psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
私は答えが遅れて来ることを知っています、それはすでに理解されているでしょう、もしそうでなければ、それは将来の訪問者にとって役に立つかもしれません。
STDINは、ハングから復帰できるようにPowerShell実行でリダイレクトする必要があります(ここでは、STDINで待機しています)。これを使用できるようにするには-inputformat none
powershell -inputformat none -File powershell_script.ps1
動作します。
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1
また、問題を修正します。
-d
psexecのフラグ は、非対話的な方法で「実行して終了」のようなものです。
-dアプリケーションが終了するのを待ちません。
非インタラクティブアプリケーションでのみ使用します。
Powershellが終了していません。このコマンドラインを試してください
Powershell -command script.ps1
私は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%