Ваша логика верна;несколько деталей не ...
- Команда
set
получает в качестве имени переменной все символы перед знаком равенства , включая пробелы .Вы должны использовать set flag=0
или, что еще лучше, set "flag=0"
. - удобно удобно заключать имена файлов в кавычки, чтобы избежать проблем, если любое имя может содержать пробелы ...
- Вы пропустили команду
set
при изменении значения flag
. - Когда значение переменной изменяется внутри
(block)
, новое значение не может бытьдоступ через %var%
, но с использованием синтаксиса !var!
и включением команды setlocal EnableDelayedExpansion
в начале программы.Есть много подробных объяснений по этому вопросу;ищите «отложенное расширение».
Это ваш код с предыдущими модификациями:
setlocal EnableDelayedExpansion
for /D %%X in (%1\*) do (
set "flag=0"
if exist "%%X\OUTPUT\%2\file1.txt" ( set "flag=1" )
if exist "%%X\OUTPUT\%2\file2.txt" ( set "flag=1" )
if !flag! == 1 ( echo %%X Succeeded >> "%3\Compilation_Check.txt")
if !flag! == 0 (
echo %%X Failed Warning >> "%3\Compilation_Check.txt"
)
)
Однако я бы сделал это следующим образом:
for /D %%X in (%1\*) do (
set "anyFile="
if exist "%%X\OUTPUT\%2\file1.txt" set "anyFile=1"
if exist "%%X\OUTPUT\%2\file2.txt" set "anyFile=1"
(if defined anyFile (
echo %%X Succeeded
) else (
echo %%X Failed Warning
)) >> "%3\Compilation_Check.txt"
)
Вы не используете значение переменной flag
.Команда if defined
позволяет проверить наличие переменной;этот «трюк» позволяет избежать проблемы с отложенным расширением ...
Вы можете заключить несколько команд в (block)
, чтобы вывод всех из них был перенаправлен в один и тот же файл ...