如何从批处理文件中的函数返回值?

Ant*_*nyM 13 windows batch-file

我有以下批处理文件

@echo off
setlocal EnableDelayedExpansion
for /f "delims==" %%J in (File_List.txt) do (
call :setDate %%J MYD
echo/Date is: %MYD%
)
endlocal &goto :eof

:setDate
SETLOCAL ENABLEEXTENSIONS
echo %1
echo %~2
set NAME=%1
set NAME=%NAME:~-11%
echo %NAME%
echo %~2
endlocal&set %2=%NAME%&goto :eof
Run Code Online (Sandbox Code Playgroud)

但是File_List.txt包含file2012-05.csv

我明白了

file2012-05.csv
MYD
2012-05.csv
MYD
Date is:
Run Code Online (Sandbox Code Playgroud)

我如何实际获取函数setDate以返回我想要的值?

小智 20

由于我不能从你的脚本中理解你想要实现的目标,我回答(完整性)原始主题:从函数返回一个值.

我是这样做的:

@echo off

set myvar=
echo %myvar%
call :myfunction myvar
echo %myvar%
goto :eof

:myfunction
set %1=filled
goto :eof
Run Code Online (Sandbox Code Playgroud)

结果是:

empty 
filled
Run Code Online (Sandbox Code Playgroud)

  • 我不确定为什么,但是[Simon Sheppard](https://ss64.com/nt/call.html)使用它作为`Set“%〜1 = filled”。无论如何,“ **”是标题中所提问题的实际答案。 (2认同)

Eit*_*n T 19

批处理解释器%MYD%在解析时进行评估,并且在那时它是空的.这就是你有延迟扩展的原因.改变这一行:

echo/Date is: %MYD%
Run Code Online (Sandbox Code Playgroud)

对此:

echo/Date is: !MYD!
Run Code Online (Sandbox Code Playgroud)

它会像你想要的那样工作,因为它告诉解释器MYD在运行时进行评估.