我已经有一段时间没有编写批处理文件了,但我遇到了以下问题:
@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
我想将 FOR 循环中的变量 %%c 存储到变量 DBFileName 中,以便我可以将该变量传递给其他函数。
这个批处理文件尚未完成,但我已经遇到了这个障碍并且陷入了困境!
预期输出:
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
通过使用 ! 而不是 % ,脚本会等待直到到达该点才评估变量
答案1
您可能需要对该FOR
语句执行的操作是将其 作为参数CALL
传递的子程序。%%c
例如:
for /f %%c in ('dir %%b\*.mdf /b') do (call :SetVar"%%c")
...
:SetVar
Set DBFileName=%1
echo Filename: %DBFileName%
goto :eof