次の簡単なスキームは機能しているようです。クリーンアップ スクリプトは、START コマンドに /WAIT オプションを指定してメイン スクリプトを呼び出します。これにより、ウィンドウを閉じて子プロセスが強制終了された場合でも、制御が確実に戻ります。
通常、親クリーンアップ スクリプトは、「バッチ ジョブを終了しますか (Y/N)?」というプロンプトを表示します。ウィンドウを閉じてメイン スクリプトを強制終了した場合。N を START コマンドにパイプして、そのプロンプトが発生した場合に自動的に応答します。stderr から nul への外部ブロックのリダイレクトは^C
、メイン ウィンドウが強制終了されたときに表示される醜い (Control-C) を抑制します。
メイン バッチ ファイルは直接開始されませんが、代わりに CMD /C コマンドを介して起動されます。これにより、Control-C を押してメイン スクリプトが強制終了された場合でも、制御が確実に戻ります。これにより、メイン スクリプトに EXIT コマンドを配置する必要もなくなります (これは決して実行されない可能性があります)。
クリーンアップ.bat
@echo off
:: Launch the main program and don't continue until it completes (or is killed)
2>nul (
echo N|start /wait "" cmd /c main.bat
)
:: Cleanup up begins here
echo Time to wrap it up!
これは、リターン機能をテストするための簡単なmain.batです。
@echo off
echo This is the main script.
echo(
echo Press any key to close normally
echo or Close this window via the console window X button
echo or Press Ctrl-C to break out of this script abnormally
pause >nul
編集
もちろん、メイン スクリプトが終了する前にユーザーが「cleanup.bat」ウィンドウを閉じるのを妨げるものは何もないので、振り出しに戻ります :-(
表示されているウィンドウを閉じることなく、wscript を介して VBScript または Jscript を実行できます。次に、(VB/J) スクリプトは main.bat スクリプトを起動し、メイン プロセスが終了した (または強制終了された) 場合にのみ cleanup.bat スクリプトを起動できます。これにより、エンド ユーザーがクリーンアップ スクリプトを開始するプロセスに干渉することがより困難になります。
マスター.vbs
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "D:\test\main.bat", 1, TRUE
WshShell.Run "D:\test\cleanup.bat", 1, TRUE
Set WshShell = Nothing
しかし、そのしきい値を超えたら、プロジェクト全体を (VB/J) スクリプトで実行してみませんか?