2012-07-10 123 views
9

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

@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 

但File_List.txt含 file2012-05.csv

我得到

file2012-05.csv 
MYD 
2012-05.csv 
MYD 
Date is: 

如何真正得到函数的setDate返回我想要的价值?

+0

我想返回%NAME%。我正在尝试使用%1,并忘记将其更改回来。我已经将代码更改回原来的版本,仍然无法正常工作。 – AnthonyM 2012-07-10 18:11:57

回答

14

批处理解释器在解析时评估%MYD%,此时它是空的。这就是为什么你有Delayed Expansion。改变这一行:

echo/Date is: %MYD% 

这样:

echo/Date is: !MYD! 

,它会像你想要的,因为那时它告诉解释在运行时间评估MYD

+0

我想(几乎)你真正想要延迟扩展的唯一时间是如果你在函数作用域的末尾使用endlocal,并且需要内联“返回”值。 – solstice333 2017-08-02 17:01:52

11

由于我不明白你的脚本你想达到什么目的,我回复(为了完整性)原始主题:从函数返回一个值。

这是我如何做到这一点:

@echo off 

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

:myfunction 
set %1=filled 
goto :eof 

结果是:

empty 
filled