这是一段时间,因为我不得不写一个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