«set /p myvar= < file.txt " не работает — почему?

#sqlite #windows-7 #batch-file #dos

#sqlite #windows-7 #пакетный файл #dos

Вопрос:

У меня есть небольшая партия Win7 dos, и мне интересно, как это сделать правильно. Вот что я делаю:

 @echo OFF
@FOR %%D IN (*.sqlite) DO (
    sqlite3 %%D "pragma integrity_check;" > %%D.check
    type %%D.check
    set /p CHECK= < %%D.check
    del %%D.check
    echo "%CHECK%"
)
 

Я бы ожидал, что для проверки установлен результат вывода sqlite. Хотя «тип» показывает ожидаемый результат, ПРОВЕРКА пуста!

И я не понимаю, что я делаю не так.

Я также пробовал это без использования tmpfile

 FOR /F "tokens=*" %%i in ('sqlite3 %%D "pragma integrity_check;"') do SET CHECK=%%i
 

но это тоже не работает…

Я был бы признателен за любую помощь / подсказку.

Заранее спасибо, Роберт

Ответ №1:

Check установлено правильное значение, но вы не можете его увидеть echo %check% , поскольку эта строка расширяется при разборе полного FOR-блока, а не во время выполнения.
Вы можете перейти на отложенное расширение или простой вызов: подпрограмма.

 @echo OFF
setlocal EnableDelayedExpansion
FOR %%D IN (*.sqlite) DO (
    sqlite3 %%D "pragma integrity_check;" > %%D.check
    type %%D.check
    set /p CHECK= < %%D.check
    del %%D.check
    echo "!CHECK!"
)
 

или

 @echo OFF
FOR %%D IN (*.sqlite) DO (
    sqlite3 %%D "pragma integrity_check;" > %%D.check
    type %%D.check
    set /p CHECK= < %%D.check
    del %%D.check
    call :output
)
exit /b

:output
echo "%CHECK%"
exit /b
 

Комментарии:

1. Отлично! С EnableDelayedExpansion теперь все работает нормально. Tnx очень нравится!

Ответ №2:

если %%D.check содержит не только одну строку

тогда set /p= будет …?