Назад | Перейти на главную страницу

Справка по пакетному файлу Dos: сохранение переменной %% c из цикла FOR [решено]

Прошло некоторое время с тех пор, как мне пришлось писать командный файл, и у меня возникли проблемы со следующим:

@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

Я хотел бы сохранить переменную %% c из цикла FOR в переменной 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

Используя ! вместо% сценарий ожидает оценки переменной, пока не достигнет этой точки

Что вам, возможно, придется сделать для FOR заявление CALL подпрограмма на проходе %%c как аргумент.

Например:

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