2012-07-10 14 views
9

Mam następujący plik wsadowyJak mogę zwrócić wartość z funkcji w pliku wsadowym?

@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 

ale z File_List.txt zawierający file2012-05.csv

uzyskać

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

Jak mogę faktycznie uzyskać setDate funkcyjny, aby powrócić wartość, którą chcę?

+0

chcę wrócić% NAME%. Eksperymentowałem z% 1 i zapomniałem go zmienić. Zmieniłem kod z powrotem na oryginał, nadal nie działa. – AnthonyM

Odpowiedz

14

Interpreter wsadowy ocenia %MYD% w czasie analizy, a w tym czasie jest pusty. Właśnie dlatego masz Delayed Expansion. Zmień tę linię:

echo/Date is: %MYD% 

do tego:

echo/Date is: !MYD! 

i będzie działać tak, jak chcesz, bo wtedy mówi interpreter do oceny MYD w czasie wykonywania.

+0

Przypuszczam, że (prawie) jedynym czasem, w którym naprawdę chcesz opóźnić ekspansję, jest użycie funkcji endlocal na końcu zakresu funkcji i konieczność wstawienia "zwrócenia" wartości. – solstice333

11

Ponieważ nie rozumiem z Twojego scenariusza, co chcesz osiągnąć, odpowiadam (dla kompletności) na oryginalny temat: zwracam wartość z funkcji.

Oto jak to zrobić:

@echo off 

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

:myfunction 
set %1=filled 
goto :eof 

Wynik jest:

empty 
filled 
Powiązane problemy