Dos 批处理文件帮助:存储 FOR 循环中的 %%c 变量

Dos 批处理文件帮助:存储 FOR 循环中的 %%c 变量

我已经有一段时间没有编写批处理文件了,但我遇到了以下问题:

@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

相关内容