28

戻り値をファイルなどに保存する必要なく、1〜9個のパラメーターと戻り値(文字列)を渡すサブバッチファイルを呼び出すWindowsバッチファイルを使用する方法を探しています。@FOR /F のように変数に保存する戻り値

私は見ます

@FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i

Call function/batch %arg1% %arg2%

これを行うためのセットアップ方法がわかりません

編集:dbenhamは私の質問に多少答えます。彼の例は、バッチ ファイルのメイン部分と関数の間でした。私の質問は、2 つの異なるバッチ ファイルの間でした。ベースオフ dbenham の回答は、次のレイアウトです。

メイン バッチ ファイル

CALL sub_batch_file.bat  return_here "Second parameter input"

REM echo is Second parameter input
ECHO %return_here%
REM End of main-batch file

sub_batch_file.bat

@ECHO OFF
SETLOCAL

REM ~ removes the " "
SET input=%~2
(
    ENDLOCAL
    SET %1=%input%
)
exit /b
REM End of sub-batch file
4

3 に答える 3

50

通常、バッチ関数は次の 2 つの方法のいずれかで値を返します。

EXIT /B n1) where n = some numberを使用して、errorlevel を介して単一の整数値を返すことができます。

@echo off
setlocal
call :sum 1 2
echo the answer is %errorlevel%
exit /b

:sum
setlocal
set /a "rtn=%1 + %2"
exit /b %rtn%

2) より柔軟な方法は、環境変数を使用して 1 つ以上の値を返すことです

@echo off
setlocal
call :test 1 2
echo The sum %sum% is %type%
call :test 1 3
echo The sum %sum% is %type%
exit /b

:test
set /a "sum=%1 + %2, type=sum %% 2"
if %type%==0 (set "type=even") else (set "type=odd")
exit /b

答えが格納される変数の名前は、パラメーターとして渡すことができます! また、中間値はメインプログラムから隠すことができます。

@echo off
setlocal
call :test 1 2 sum1 type1
call :test 1 3 sum2 type2
echo 1st sum %sum1% is %type1%
echo 2nd sum %sum2% is %type2%
exit /b

:test
setlocal
set /a "sum=%1 + %2, type=sum %% 2"
if %type%==0 (set "type=even") else (set "type=odd")
( endlocal
  set "%3=%sum%"
  set "%4=%type%"
)
exit /b

最後の例がどのように機能するかの完全な説明については、DOStips にあるこの優れたバッチ関数のチュートリアルをお読みください。

アップデート

上記の場合でも、返品できるコンテンツには制限があります。より広い範囲の値をサポートする FOR に基づく代替方法については、https://stackoverflow.com/a/8254331/1012053を参照してください。また、https://stackoverflow.com/a/8257951/1012053を参照して、どのような状況でも、長さが ~8190 未満の任意の値を安全に返すことができる「魔法の」手法を確認してください。

于 2012-07-14T18:09:18.847 に答える
5

小さなヒント

Setlocal EnableDelayedExpansion
IF 1==1 (
    CALL :LABEL
    echo 1: %errorlevel%
    echo 2: !errorlevel!
)
echo 3: %errorlevel%

:LABEL
EXIT /B 5

出力は次のようになります。

1: 0
2: 5
3: 5

EnableDelayedExpansionを使用すると、!var_name! を使用できます。解析時ではなく、実行時に var を展開します。

于 2014-08-11T17:30:08.360 に答える
1

あなたはいくつかのことを見逃しています:

  • 一重引用符ではなくバッククォートを使用してください。
  • tokens コマンドで、二重引用符の中に usebackq を追加します。

この文字は「この文字ではありません」

アメリカ英語のキーボードでは、バックティックはシフト チルダで、通常は数字行の 1 の左側にあります。

@FOR /F "usebackq tokens=*" %%i IN (`%find_OS_version%`) DO SET OS_VER=%%i
于 2012-07-14T05:34:39.833 に答える