web-dev-qa-db-ja.com

バッチファイルの関数/メソッドのようなものですか?

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の後の行を確実に呼び出すにはどうすればよいですか?

53
stefan.at.wpf

再利用可能な関数を別のバッチファイルに配置すると、関数をシミュレートするのに確実に機能します。

キャッチは、callコマンドを使用して、2番目のバッチファイルの実行が終了した後に制御が呼び出し元に戻るようにする必要があることです。

call 5lines.bat
echo this will now get called
21
Cody Gray

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

ソース: バッチ関数

70
Erwald

完全を期すために、関数にパラメーターを渡すこともできます。

関数呼び出し

call :myDosFunc 100 "string val"

関数本体

:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
goto :eof
22
Shital Shah

解決策:

@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%

14
DmitrySemenov

このページ にリストされている例を使用してみてください。

または、メイン行から呼び出す別のバッチファイルに共通の行を入れることもできます

5
Attila

バッチファイルで "匿名"関数 を使用できるようにする「ハック」を次に示します。

@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ステートメントが必要です。

2
npocmaka

再利用可能なバッチファイルコードの記述に関する別の優れたチュートリアルについては、 Richie Lawrenceの優れたライブラリ を参照してください。

1
jwfearn

他の回答から明らかであったかどうかはわかりませんが、明確にするためにこの回答を投稿しています。以下のコードを書くのに役立つ他の回答が見つかりました。

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%
1
pasha