java、C#などから知っているようなメソッドを模倣するものはありますか?バッチファイルには5行のコマンドがあり、それらの5行はバッチファイル内の複数の場所で使用されます。 gotoを使用することはできません。これらの5行によって作成されたエラーレベルに応じて、後続のアクションが異なるためです。 5行をバッチファイル5lines.batに入れようとしましたが、元のバッチファイルoriginal.batは5lines.batのみを呼び出し、5lines.batの呼び出し後にコマンドを実行しません):それが私のoriginal.batの外観ですのような:
5lines.bat
echo this gets never called, how to make sure this gets called?
5lines.batには出口やこのようなものはありません! 5lines.batの後の行を確実に呼び出すにはどうすればよいですか?
再利用可能な関数を別のバッチファイルに配置すると、関数をシミュレートするのに確実に機能します。
キャッチは、call
コマンドを使用して、2番目のバッチファイルの実行が終了した後に制御が呼び出し元に戻るようにする必要があることです。
call 5lines.bat
echo this will now get called
Callコマンドを使用できます:
call:myDosFunc
そして、この方法で関数を定義します:
:myDosFunc - here starts the function
echo. here the myDosFunc function is executing a group of commands
echo. it could do a lot of things
goto:eof
ソース: バッチ関数
完全を期すために、関数にパラメーターを渡すこともできます。
関数呼び出し
call :myDosFunc 100 "string val"
関数本体
:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
goto :eof
解決策:
@ECHO OFF
call:header Start Some Operation
... put your business logic here
... make sure EXIT below is present
... so you don't run into actual functions without the call
call:header Operation Finished Successfully
EXIT /B %ERRORLEVEL%
:: Functions
:header
ECHO =================================================
ECHO %*
ECHO =================================================
EXIT /B 0
EXIT/Bを各関数の最後、および関数定義の開始前に配置することが重要です。私の例では、これは次のとおりです。
EXIT/B%ERRORLEVEL%
このページ にリストされている例を使用してみてください。
または、メイン行から呼び出す別のバッチファイルに共通の行を入れることもできます
バッチファイルで "匿名"関数 を使用できるようにする「ハック」を次に示します。
@echo off
setlocal
set "anonymous=/?"
:: calling the anonymous function
call :%%anonymous%% a b c 3>&1 >nul
:: here the anonymous function is defined
if "%0" == ":%anonymous%" (
echo(
echo Anonymous call:
echo %%1=%1 %%2=%2 %%3=%3
exit /b 0
)>&3
::end of the anonymous function
無名関数ブロックは、callステートメントの直後に配置し、exitステートメントで終了する必要があります
トリックは、CALL
が内部でGOTO
を使用し、CALL
が実行された行に戻ることです。二重展開では、GOTOヘルプメッセージがトリガーされます(%%/?%%
引数)そして、スクリプトを続けます。しかし、終了後はCALL
に戻ります。そのため、ifステートメントが必要です。
再利用可能なバッチファイルコードの記述に関する別の優れたチュートリアルについては、 Richie Lawrenceの優れたライブラリ を参照してください。
他の回答から明らかであったかどうかはわかりませんが、明確にするためにこの回答を投稿しています。以下のコードを書くのに役立つ他の回答が見つかりました。
echo what
rem the third param gives info to which label it should comeback to
call :myDosFunc 100 "string val" ComeBack
:ComeBack
echo what what
goto :eof
:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
set returnto=%~3
goto :%returnto%