2009-06-01 10 views
6

私はそれにいくつかのサブルーチンと、このような何かWindowsバッチファイルを持っている:私はVista上のcmdウィンドウでこれを実行している'call'edルーチン内からWindowsバッチファイルを終了する方法は?

call :a 
goto :eof 

:a 
call :b 
goto :eof 

:b 
:: How do I directly exit here from here? 
goto :eof 

を。
バッチファイルのどこかでエラーが検出された場合は、エラーレベルがゼロ以外で終了します。ルーチンに書くことができるものはありますか?これは、バッチファイルをこのように終了させる原因になります。

  • 「exit」を試しましたが、これはcmdウィンドウ全体を閉じます。それは私が望むものではありません。
  • 私は 'exit/B1'を試しました。それは以前のルーチンに戻ります。すべての '呼び出し'の後にこのスキームを使用するには、呼び出しスタックをバックアップするエラーを渡すたびに、 'callle'の後に 'errorlevel 1 exit/B 1'を注意深く記述する必要があります。私はすべての呼び出しの後にこの行を書く必要はありません。

この記事は面白かったですが、選択肢の中で私が望むように行動しません。 http://www.computerhope.com/exithlp.htm

別の方法がありますか?

ありがとうございました。

答えて

14

あなたはそうのようなあなたのサブルーチンを呼び出すことができます。

call :b||exit /b 1 

それは少し短いですし、あなたに1つの行が保存されますが、それは、私は同意し、まだ理想的ではありません

call :b 
if errorlevel 1 exit /b 1 

に相当します。

それ以外の方法はありません。

EDIT:私は方法がありますが、それはPure Evil™です。最大スタックサイズ、したがって再帰制限を誤って使用

は、我々は単に自分自身を再帰的に呼び出すことにより、スタックを使い果たす別のサブルーチンを作成:

@echo off 
echo Calling a 
call :a 
echo Called a 
goto :eof 
:a 
echo Calling b 
call :b 
echo Called b 
goto :eof 
:b 
echo Trying to exit 
call :exit 
goto :eof 
:exit 
call :exit 

これを、しかし、厄介なエラーメッセージが表示されます

 
****** B A T C H R E C U R S I O N exceeds STACK limits ****** 
Recursion Count=704, Stack Usage=90 percent 
******  B A T C H PROCESSING IS A B O R T E D  ****** 

また、私のマシンでは約2秒かかります。

次のようにcallステートメントを変更することによって、エラー・メッセージを抑制することができます。

偉大無効に出力することが望んでいるすべてのものをリダイレクトします
call :exit >nul 2>&1 

を。

しかし、スタックを埋めるのに時間がかかることを考えれば、最初の変種はもっと簡単だと思います。

また、callを実行しないと、最初のバッチファイルを停止する2番目のバッチファイルの使用を検討していました。しかし、何とかそれはサブルーチンでうまくいっていません。呼び出しスタックのアンロールは、一見、依然として行われます。

+4

よろしくお願いいたします。これはこれまでのところ最高です。これから、 "call:a || goto:eof"を使用すると、エラーレベルがバックアップに反映されます。特定のエラーレベルにいくつかの意味がある場合に役立ちます。 –

+0

はい、それは本当に良いと思います。それを考えなかった。また、私が概説した再帰的アボートは実際の選択肢ではないと思います。 – Joey

+0

はい、再帰的アボートは新規であったが、そこから少し遠すぎた! :) –

0

トップbatファイルをタイトル名で削除するexit.batファイルを作成できます。

例:

@echo off 
title A.bat 
echo A.bat 
call B.bat 
echo A.bat 

A.bat

B.bat

@echo off 
echo B.bat 
exit.bat A.bat 
echo B.bat 

Exit.bat

@echo off 
echo exit.bat 
kill %1 
+1

間違いなくクールで間違いなく悪いですが、このアプローチは完全なcmdプロセスを取り除きます。それはまさに出口が何をするのか、OPが受け入れられるとは考えていないものです。また、Windowsではkillコマンドがないので、killはtaskkill/fi "windowtitle -eq%1"に置き換えなければなりません。 – Joey

+0

ああ「Windows用のデバッグツール」(WinDbg)をインストールしていて、kill.exeのコピーが入っているのを忘れてしまった。タスクキルコマンドのおかげで、私はそれがそこにあったことを認識しなかった。 –

+0

ウィンドウ全体を壊す苦痛を少なくするには、起動するcmd a.batを使用して、殺す部分を消してください。 –

関連する問題