web-dev-qa-db-ja.com

バッチファイルを「呼び出す」または「呼び出さない」

Batファイル内から別のバッチファイルを呼び出したが、まだいくつかの残りの操作が残っている場合、最初のbatファイルの呼び出しが完了またはエラーの後、最初に呼び出したファイルに戻ることを確認するにはどうすればよいですかインスタンス?

例:

CD:\MyFolder\MyFiles
Mybatfile.bat

Copy afile toHere

または

CD:\MyFolder\MyFiles
CALL Mybatfile.bat

COPY afile toHere

CALLまたはSTARTを使用する場合と、まったく使用しない場合の違いは何ですか?これは、コピーコマンドの結果を返すかどうかに影響を与えますか?

48
AltF4_

他の人が言ったように、CALLは.bat内の別のbatファイルを呼び出して呼び出し元に戻る通常の方法です。

ただし、CALLedバッチファイルに致命的な構文エラーがある場合、またはCALLedスクリプトが/ BオプションなしでEXITで終了する場合、すべてのバッチファイル処理は停止します(制御は呼び出し元に戻りません)。

CMDコマンドを使用して2番目のスクリプトを実行すると、コントロールが呼び出し側に戻ることを保証できます(もちろん、コンソールウィンドウが開いている限り)。

cmd /c "calledFile.bat"

ただし、これには、呼び出されたバッチによって設定された環境変数が戻るときに保持されないという制限があります。

すべての場合に返品を保証し、環境の変更を保持するための良い解決策を知りません。

CMDの使用中に変数を保存する必要がある場合は、「呼び出された」スクリプトに変数の変更を一時ファイルに書き込み、呼び出し元に一時ファイルを読み取らせて変数を再確立させることができます。

55
dbenham

callは.batまたは.cmdファイルに必要です。それ以外の場合、コントロールは呼び出し元に戻りません。
exeファイルの場合、必須ではありません。

Startcallと同じではありません。新しいcmd.exeインスタンスを作成するので、非同期でcalledバッチファイルを実行できます

32
jeb

「CALL」ステートメントはMS-DOS 3.3で導入されました

これは、呼び出し元のバッチファイルの実行を中断せずに、両方のバッチファイルに同じ環境を使用して、バッチファイル内の他のバッチファイルを呼び出すために使用されます。

したがって、あなたの場合の解決策はCALLを使用することです

10
Saju

OK呼び出しを使用します。

私は別の理由で自分自身に電話をかけていますが、実際には他の誰も育てていないことにかなり驚いています。たぶん見逃した。多分私は世界で唯一の誰だか知っている!! :O

おそらくそうではありませんが、この知識は非常に役立つため、ここから削除します。

呼び出しを使用する場合、バイナリロジック演算子を使用して、ERRORLEVELの結果に基づいて処理方法を決定できます。実際、私はいつも&&と||に驚いた。 DOSに存在し、この方法で使用することはできません。それが理由です。

これをテストする最も簡単な方法は、メモ帳で_return.cmd_を作成するか、コマンドプロンプトから次のようにすることです。

_c:\> type con >return.cmd       
_

これで、カーソルが次の行に移動してハングすることがわかります。入る:

_@exit /B %1
_

そして、[ENTER]、[CTRL]-[Z]を押すと、そのファイルが作成されます。良い!次の2つの例を試してみてください。

call return.cmd 0 && echo Huzzah! A Complete Success! (Or cover up...)

_call return.cmd 123 || echo Oops! Something happened. You can check ERRORLEVEL if you want the tinest amount of additional information possible._

だから何?さて、0と123を交換して再度実行すると、メッセージが印刷されないことがわかります。

たぶん、この複数行の例はもっと理にかなっているでしょう。私はこれを常に使用します:

_     call return.cmd 0 && @(
         echo Batch says it completed successfully^^!
     ) || @(
         echo Batch completed, but returned a 'falsey' value of sort.
         call echo The specific value returned was: %ERRORLEVEL%
     )     
_

(2番目の 'echo'の前の_||_セクションの 'call'に注意してください。これは、人々が1日で拡張を遅らせないようにする方法だと思います。拡張を有効にしている場合バッチ内OR _cmd /v:on_でコマンドプロンプトを起動すると、!ERRORLEVEL!を実行できます。)

...ここで謝罪し、過去に_if ERRORLEVEL_のトラウマがある場合は読むのをやめるべきだと言います。わかった。私を信じて。私はこれをリモートで入力するためにfiverで誰かにお金を払うことを考えましたが、完全を期すために、チームのために1つ取って、エラーレベルをチェックするために次のこともできることに言及します:

_    if ERRORLEVEL 123 @echo QUICK! MOTHERS, COVER YOUR CHILDREN'S EYES! FINGERS ARE BEING UNDONE! :'(
_

それまでに一度もタイプしたことがないのなら、GOOD!期待どおりの結果が得られない理由を読む必要なく、長生きできます。残酷はあなたが探している言葉であり、「風変わりな」言葉ではありません。


しかし、私が本当に知りたい重要な部分は、これを試して「呼び出し」を使用しない場合、常に「true」ブランチを実行することです。自分で試してみてください!

何か不足している場合、またはこれを行うためのより良い方法を知っている場合は、お知らせください。このようなことを学ぶのが大好きです!


私が言及した追加情報:

私はかなり長い間、次のようなコマンドの前にリダイレクトを配置できることを知っています。

_    >nul echo. This won't be displayed!
_

しかし、先日、偶然にもあなたが明らかにできることができるドゥムダムであることを発見しました:

_    echo A B>file.txt C
_

そして、「A B C」で構成された_file.txt_を見つけて本当に驚きました。コマンド内であっても、どこにでも配置できるようです。私は誰もこれをするのを見たことも、言及することもありませんが、人々があなたに彼らの行の前に付けることができると言うのを見ました。

たぶん、それはWindows 10か何かに排他的なバグです。別のバージョンがあり、それを試してみて、私があなたが見つけたものに興味があることを知らせてください。

オタクだ!

1