36

コマンドを使用して親ファイル内からネストされたバッチファイルを呼び出す方法を理解していますcall。これには、次のようなリソースがたくさんあります。

ただし、別のバッチファイルを別のバッチファイルから呼び出すと親が終了する理由がわかりません。

あまり抽象的な例ではないが、別々のバッチファイルを「リンク」するバッチファイルがあり、誤ってcall各行の先頭に追加しなかったとします。

foo.bat
bar.bat

これはfoo.batを実行してから終了するだけです。両方のコマンドを正しく実行するには、各ステートメントの前に呼び出しを追加する必要があります。

call foo.bat
call bar.bat

最初の機能がまだ存在するのはなぜですか?なぜ変更されていないのですか?call1980年代後半にリリースされたMS-DOS3.3で導入されたことに気づきましたが、この機能は下位互換性のためにまだここにありますか?

私はそれの(実用的な)使用法を考えることはできませんが、おそらく私は「新しい」プログラミング技術にあまりにも慣れています。

4

3 に答える 3

37

DOSは単純なテキスト処理を使用していたため(FILES=20config.sysで20個のファイルハンドルを許可するようなものがあったとき)、ファイルを開き、次の行を読み取り、ファイルを閉じて、読み取ったばかりの行を実行しました。ファイルが別のファイルを呼び出した場合、処理はそのファイルで続行されるため、バッチファイルに必要なファイルハンドルは1つだけです。

Microsoftがcallコマンドを入力するまで、元のファイルに戻る方法はありませんでした(前のファイルの名前をパラメーターとして指定したり、一時ファイルを使用して元のバッチファイルに処理が行われたことを通知したりする必要があります)。 、そしてGOTOファイルの次の部分になる可能性があります)。

于 2012-07-24T21:08:58.967 に答える
8

Sean Cheshireが書いたように、下位互換性のために必要です。

ただし、使用せずにバッチファイルからバッチファイルを開始しCALLても、親は終了しません。
通常、2番目のバッチが終了した後、親はそれ以上実行されないため、このように見えます。
ただし、second.batを開始する前に呼び出しを使用すると、最初のバッチが終了していないことが示されます。

parent.bat

echo parent.bat
call :myLabel
echo back in parent.bat main
exit /b

:myLabel
second.bat & echo back in parent.bat
exit /b

second.bat

echo second.bat
exit /b

ここでは、secpond.bat & echo back ...cmd.exeの別のバグ/機能を回避するためにを使用します。エクストラなしで
使用すると、開始してラベルにジャンプします!second.batsecond.bat :myLabelsecond.bat

于 2012-07-25T08:46:02.310 に答える
0

Call基本的には、「この他のバッチファイルを実行してから、ここに戻って続行する」と言っています。DOS 3.3かそこらから存在しており、削除するとすべての下位互換性が失われます(これが、人々がまだバッチスクリプトを使用している理由です)。また、場所への分岐にも使用でき:linkます。

使用法と構文に関する情報(他の人の将来の参照用)については、このMSTechNetリンクを参照してください。

新しい機能が必要な場合は、代わりにCMDスクリプトまたはPowerShellスクリプトを使用してください。

于 2012-07-24T20:40:02.303 に答える