いつもお世話になっております。
Power Shellにてタイムアウトの判定を設けたいと考えています。
目的
別のpowershellプログラムを呼び出すPowershellのプログラムを開発しております。
呼び出し元Aのプログラムから呼び出し先Bのプログラムを実行し呼び出し先Bの完了時間に
よってタイムアウトの判定を設けたいと考えております。
コード
$_mypass = Split-Path $MyInvocation.MyCommand.Path #powershell.exeが存在しているパスを格納 $Powershell = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" #起動したいジョブに渡す引数を格納 $_Automd = 1 #起動したいジョブの格納先と引数を格納 $ScriptFile = "$_mypass\log_scaveng.ps1 $_Automd" #powershell.exeが実行するコマンドを格納 $Argument = "-Command $ScriptFile" #タイムアウトの秒数を指定 $_TimeoutSecond = 600 #以下コメントアウトは単体で実行されることを確認 Start-Process -FilePath $Powershell -ArgumentList $Argument #Start-jobコマンドとStarr-Processコマンドを併用 実行されず $_Mainjob = Start-Job {Start-Process -FilePath $Powershell -ArgumentList $Argument} コード
疑問点及び考察
Start-Jobコマンドレットにてパラメータに対し処理を渡す際、パラメータに指定するコマンドに
Start-Processは使えないのでしょうか。また、アンパサンドを使用した外部プログラムの実行方法と
Start-Jobコマンドレットの併用も行えませんでした。
外部プログラムの実行のジョブ状態をStart-Jobコマンドレットにて取得するのは不可能なのでしょうか。
どなたか、ご回答いただければ幸いです。
以上になります。よろしくお願いいたします。
Job ではないのでできないと思います。System.Diagnostics.Process を返すので、それをもとにプロセスの状態を取得し、必要であれば kill してください。
Zuishin様
いつもお世話になっております。ご回答ありがとうございます。
System.Diagnostics.Processを返すというのはStart-Processコマンドレットの戻り値として
帰ってくるものという認識で間違いないでしょうか。
またStart-ProcessコマンドレットがSystem.Diagnostics.Processを返すには-PassThruオプションを
使用しないと返ってこないようなので追加で-PassThruオプションを付与しようと思います。
プロセスの状態を取得するのはいずれかのメソッドを使用する解釈ですよね?
質問ばかりで申し訳ありません。
ただ、かなりやりたいことには近づけているような気がします。
ご教授いただきありがとうございます。
どちらもその通りです。
次に C# でのサンプルがありますが、HasExited プロパティと Kill メソッドを使ってください。CloseMainWindow() は GUI アプリの時に有効ですが、コンソールアプリでは使えません。ただし Kill は問答無用でプロセスを終了させるので、そのプロセスの残りの処理ができなくなります。
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.hasexited?view=netframework-4.8
Zuishin様
上記リンクにてドキュメントのご提供ありがとうございました。
プロセスの状態について取得することが可能になりました。
タイムアウトの判定について引っかかってしまった場合の後処理はKillにて
対応しようと思います。(以降の処理については切り捨てる方向で問題ないので)
本当にありがとうございました。
こちらもベストアンサーに選ばせていただきたいのですが、
回答として、ご記入し直していただくことは可能でしょうか?
以前のように自己解決としてのご希望がありましたらそのようにさせていただきます。
本当にありがとうございました。また機会がございましたら、よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー