Список всех ZIP-файлов, содержащих файл ошибки (пакетный, cmd)

У меня есть папка с кучей zip-файлов, некоторые из которых содержат файл «* error.pdf». Мне нужно создать файл «errors.txt», содержащий имена файлов zip, содержащих такой файл ошибки.

Мне нужна помощь с условием. FINDSTR устанавливает для ERRORLEVEL значение 0, если строка найдена, и значение 1, если нет. Я пробовал if not errorlevel 1 и if %ERRORLEVEL% == 0.

for %%X in (*) do (
    "c:\Program Files\7-Zip\7z.exe" l "%%X" | findstr error > nul
    if errorlevel 0(
        ECHO "%%X" >> errors.txt
    )
)

Прямо сейчас ничего не происходит (если условие всегда ложно), если я устанавливаю условие, чтобы оно всегда было истинным, оно записывает все имена файлов в error.txt.

"c:\Program Files\7-Zip\7z.exe" l "%%X" | findstr error выводит имена файлов *error.pdf


person a149373    schedule 06.06.2019    source источник
comment
Используйте findstr /IEC:"error.pdf", так как имена файлов в Windows нечувствительны к регистру и соответствуют описанному вами критерию поиска. Затем поместите пробел между if errorlevel 0 и (. Возможно, вы захотите перебирать только ZIP-файлы, поэтому используйте for %%X in (*.zip) do (при необходимости вы даже можете использовать несколько масок, таких как *.zip *.rar). Наконец, измените эхо на >>errors.txt echo(%%X, чтобы избежать "" и отслеживание пробелов для вывода...   -  person aschipfl    schedule 06.06.2019
comment
Рассматривали ли вы возможность уточнения параметров исполняемой команды, подобных этой l "%%X" -i!*error.pdf   -  person Compo    schedule 06.06.2019
comment
Хм, но поскольку if errorlevel 0 означает, что если уровень ошибки равен 0 или больше нуля, вместо этого следует использовать if not errorlevel 1.   -  person Magoo    schedule 06.06.2019


Ответы (1)


Проблема заключалась в отсутствии пробела между if errorlevel 0 и ( (спасибо aschipfl).

Правильное условие для оператора if также было if not errorlevel 1, как упоминалось Magoo.

Это рабочий код (с улучшениями, упомянутыми aschipfl)

for %%X in (*.zip) do (
    "c:\Program Files\7-Zip\7z.exe" l "%%X" | findstr error > nul
        if not errorlevel 1 (
        ECHO %%X >> errors.txt
        )
        )
person a149373    schedule 06.06.2019
comment
Вы можете упростить команду с помощью условного выполнения в случае успеха && до одной строки =› for %%X in (*.zip) do "c:\Program Files\7-Zip\7z.exe" l "%%~X"|findstr error >nul &&(ECHO %%X >> errors.txt) - person ; 06.06.2019
comment
@LotPings спасибо, я отмечу это на потом, но я использую несколько строк для лучшей читабельности - person a149373; 06.06.2019