Прошло некоторое время с тех пор, как мне пришлось писать командный файл, и у меня возникли проблемы со следующим:
@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