74

JavaやC#などから知っているようなメソッドを模倣するものはありますか?バッチファイルに5行のコマンドがありますが、これらの5行はバッチファイル内の複数の場所で使用されています。これらの5行によって作成されたエラーレベルに応じて、次のアクションが異なるため、gotoを使用できません。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が呼び出された後の行を確認するにはどうすればよいですか?

4

10 に答える 10

88

次の呼び出しコマンドを使用できます。

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

ソース:バッチ関数

于 2012-04-13T22:42:10.450 に答える
40

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

関数呼び出し

call :myDosFunc 100 "string val"

関数本体

:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
goto :eof
于 2018-01-27T11:32:21.650 に答える
31

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

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

call 5lines.bat
echo this will now get called
于 2012-04-13T22:42:22.197 に答える
18

解決:

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

于 2015-07-01T15:23:34.907 に答える
7

DOSバッチ-関数チュートリアルにリストされている例を使用してみることができます

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

于 2012-04-13T22:43:18.623 に答える
5

バッチファイルに「匿名」関数を含めることができる「ハック」を次に示します。

@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た行に戻ることです。ダブル展開すると、GOTO ヘルプ メッセージが (引数CALL付きで) トリガーされ、スクリプトが続行されます。%%/?%%しかし、それが終わった後、それはに戻りますCALL- そのため、if ステートメントが必要です。

于 2017-01-14T15:44:55.117 に答える
3

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

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%
于 2018-08-14T07:41:33.323 に答える