2017-12-31 149 views
2

私はexeプロセスを起動するpowershellスクリプトを持っています。私はコンピュータのアイドル状態でこのpowershellスクリプトを実行する予定のタスクを持っており、アイドル状態ではないときに停止するように設定しています。powershellスクリプトから起動した子プロセスを強制終了するタスクスケジューラを取得する方法

問題はタスクスケジュールが起動したexeプロセスを強制終了しないことです。私はそれが単にpowershellプロセスを強制終了しようとしていると仮定しています。

私は呼び出し-表現でプロセスを起動しようとした

それはタスクスケジューラから起動だときたpowershell.exe のサブプロセスとして起動exeファイルを作成する方法を見つけるように見えることはできません、 start-proces、私はout-null、wait-processなどにパイプしようとしました。ps1がタスクスケジューラから起動されても何も動作していないようです。

これを行う方法はありますか?

おかげ

+0

'start-process'はJobオブジェクトを使ってプロセスツリー全体を待つことができますが、このジョブを' JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE'として設定しません。したがって、PowerShellを終了しても、ジョブ内のプロセスには影響しません。 – eryksun

+0

これはC#で行うのは簡単ではありません:https://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed –

答えて

4

私はプロセスがどの通知を受信しないと、あなたが任意のクリーンアップを行う機会を得ることはありませんterminatedとき以来、あなたの問題の簡単な解決策があるとは思いません。

しかし、あなたはあなたの最初のプロセスを監視し、あなたのためのクリーンアップを行い、別のウォッチドッグ・プロセス生むことができます。

を、それが行うには他に何もしていた後、起動スクリプトは、待機:

#store pid of current PoSh 
$pid | out-file -filepath C:\Users\you\Desktop\test\currentposh.txt 
$child = Start-Process notepad -Passthru 
#store handle to child process 
$child | Export-Clixml -Path (Join-Path $ENV:temp 'processhandle.xml') 

$break = 1 
do 
{ 
    Sleep 5 # run forever if not terminated 
} 
while ($break -eq 1) 

ウォッチドッグスクリプトは殺します子が起動スクリプトを終了した場合:

これは多少複雑で状況によっては単純化することができます。とにかく、あなたはそのアイデアを得ると思います。

+0

ありがとう。これは意味がある、私はそれにショットを与えるだろう – fenderog

関連する問題