DOSbatch file帮助:存储FOR循环%% cvariables

这是一段时间,因为我不得不写一个batch file,我遇到了以下问题:

@echo off SETLOCAL ENABLEDELAYEDEXPANSION for /f %%a in ('dir f:\*mssql* /ad/b') do ( for /f %%b in ('dir f:\%%a\data /ad/s/b') do ( for /f %%c in ('dir %%b\*.mdf /b') do ( Set DBFileName=%%c echo Filename: %DBFileName% ) ) ) ENDLOCAL GOTO:EOF 

我想将variables%% c从FOR循环存储到variablesDBFileName中,以便我可以将这个variables传递给其他函数。

这个batch file还没有完成,但我已经打了这个路障,我是STUCK!

预期产出:

 Filename: tempdb.mdf Filename: testdb.mdf Filename: master.mdf Filename: model.mdf Filename: msdb.mdf Filename: fubar.mdf 

实际产出:

 Filename: Filename: Filename: Filename: Filename: Filename: 

有任何想法吗? 谢谢

我的回答(没有足够的代表回答自己的问题)

这是变数的延迟扩大,带回了不好的回忆。

需要使用! 代替 %

示例脚本

 :FindSQL @echo off SETLOCAL ENABLEDELAYEDEXPANSION for /f %%a in ('dir f:\*mssql* /ad/b') do ( for /f %%b in ('dir f:\%%a\data /ad/s/b') do ( for /f %%c in ('dir %%b\*.mdf /b') do ( Set DBFileName=%%c Echo Filename: !DBFileName! Set DBPath=%%b\%%c ) ) ) echo At this point the DBPath variable still works.. echo See? %DBPath% ENDLOCAL GOTO:EOF 

通过使用 ! 而不是%脚本等待评估variables,直到达到这一点

你可能要做的FOR语句是CALL一个子程序在传递它%%c作为参数。

例如:

 for /f %%c in ('dir %%b\*.mdf /b') do (call :SetVar"%%c") ... :SetVar Set DBFileName=%1 echo Filename: %DBFileName% goto :eof