Подавить ошибку FORFILES "не найдено файлов"
Я работаю с пакетным файлом для удаления архивированных документов старше 14 дней, и я вызываю файл из процесса автоматизации (LANSA Composer), который читает код возврата скрипта, чтобы узнать, была ли проблема. Вот скрипт:
@echo off
@Echo Deleting files older than 14 days...
cd /d C:WindowsSystem32
FORFILES /P "[file path...]IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file"
проблема в том, что скрипт возвращает код ошибки и печатает "ERROR: No files found with the specified search criteria", если он не находит файлы для удаления, когда я действительно хочу, чтобы он вернул ошибку, если есть проблема с доступом к каталогу или запуском команды del и т. д. Есть ли способ заставить этот скрипт подавить ошибку "нет найденных файлов", но позволить другим пройти?
после некоторого Googling я попробовал решения на на этой странице, но они не будут работать для того, что я хочу, так как в первом случае он подавляет все ошибки, а во втором передается текст сообщения об ошибке, но фактический код возврата по-прежнему подавляется (что является то, что автоматизация процесс чтения).
6 ответов
Это должно решить этот вопрос:
@echo off
Echo Deleting files older than 14 days...
cd /d C:\Windows\System32
copy /b forfiles.exe "[file path...]\IDOC_ARCHIVE" >nul
FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file"
решение состоит в том, чтобы захватить выходные данные команды FORFILES в цикле FOR, найти строки, начинающиеся с ошибки, и сохранить результат в переменной. Оттуда вы можете использовать директивы IF/ELSE для установки errorlevel
соответственно. Вот код (минус несколько журналов и комментариев):
cd /d C:\Windows\System32
SET _CmdResult=NONE
FOR /F "tokens=*" %%a IN ('FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c DEL @file" 2^>^&1 ^| FINDSTR ERROR') DO SET _CmdResult=%%a
IF "%_CmdResult%" == "ERROR: No files found with the specified search criteria." (
SET errorlevel=0
) ELSE (
SET errorlevel=1
)
IF "%_CmdResult%" == "NONE" SET errorlevel=0
просто убедитесь, что избежать любых символов, таких как >&|
в цикле FOR.
добавление 2>nul сделало трюк. Спасибо!
forfiles /п d:\todayfiles /Д +0 /ц "УМК /с Эхо @путь" 2 > nul / найти ": "/c
могу ли я добавить скромный вклад в эту уже ценную тему. Я нахожу, что другие решения могут избавиться от фактического текста ошибки, но игнорируют %ERRORLEVEL%, который сигнализирует об ошибке в моем приложении. И я законно хочу %ERRORLEVEL% до тех пор, пока это не ошибка "нет найденных файлов".
Примеры:
отладка и устранение ошибок в частности:
forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success
использование oneliner чтобы вернуть успех или неудачу ERRORLEVEL:
forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0
использование oneliner для сохранения уровня ошибок на нуле для успеха в контексте batchfile посреди другого кода (ver > nul сбрасывает уровень ошибок):
forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul
для шага задания CmdExec агента SQL Server я приземлился на следующем. Я не знаю, является ли это ошибкой, но CmdExec в пределах шага распознает только первую строку кода:
cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%
надежную влияет на ошибки нужно выполнить последующую команду, которая гарантирует ошибки 0. Я использую сам интерпретатор команд (cmd.exe), чтобы сделать это, как в следующем фрагменте:
FORFILES /M:somefiles /D -14 2>nul | cmd /c ""
надеюсь, это кому-то поможет.
это легко разрешимо с одним вкладышем. Просто добавьте это в команду forfiles:
2>&1 | find /v /i "ERROR: No files found with the specified search criteria."
так что вы получите:
FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file" 2>&1 | find /v /i "ERROR: No files found with the specified search criteria."
только указанное сообщение об ошибке не отображается. Все остальные сообщения.
вот как это работает: