2

バッチ「スクリプト A」を実行する必要があります。これは、「[y / n] の質問を終了しますか」によってバッチがプログラムで閉じられた場合、またはバッチ内のすべてのスクリプトが終了した場合にのみ実行されます。

ユーザーがマウス ボタン (コンソールの右上にある "X") を使用してバッチを閉じることを決定した場合、バッチがクラッシュした場合、残念ながら "スクリプト A" は実行されません。

「X」の瞬間をプログラムで傍受し、別のバッチを起動して証書を完成させるにはどうすればよいですか?

敬具、

マレック

4

2 に答える 2

3

次の簡単なスキームは機能しているようです。クリーンアップ スクリプトは、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) スクリプトで実行してみませんか?

于 2012-07-25T21:30:42.667 に答える
0

バッチは、赤い X からいつ閉じられるかわかりません。したがって、X からの閉じを処理するコードは、別の場所から取得する必要があります。1 つの可能性はTASKLIST、最初のバッチがいつ閉じられるかを監視するために別のバッチを使用することです。

于 2012-07-25T20:14:47.830 に答える