2012-07-10 7 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

を含むと私はどのように私は実際には関数のsetdateを返すように得るか

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

を取得私が望む価値?

+0

私は%NAME%さんを返したいです。私は%1を試していて、それを元に戻すのを忘れました。コードを元のコードに戻してもまだ動作しません。 – AnthonyM

答えて

14

バッチインタープリタは、解析時に%MYD%と評価され、そのときは空です。だからあなたはDelayed Expansionです。それは、実行時にMYDを評価するインタプリタを伝えますので、

echo/Date is: !MYD! 

とあなたが望むようにそれは動作します:これまで

echo/Date is: %MYD% 

:この行を変更します。

+0

関数のスコープの終わりにendlocalを使用していて、値の "返す"インライン化が必要な場合は、遅延拡張を本当に欲しいと思うのは(ほぼ)唯一の時間だと思います。 – solstice333

11

あなたが達成したいことをあなたのスクリプトから理解していないので、元の主題に返信します(完全性のために)。関数から値を返します。ここで

は、私はそれを行う方法です。

@echo off 

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

:myfunction 
set %1=filled 
goto :eof 

結果は次のとおりです。

empty 
filled 
関連する問題