Подавить ошибку 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."

только указанное сообщение об ошибке не отображается. Все остальные сообщения.

вот как это работает:

  • 2>&1 используется для отправки STDERR в же куда мы отправляем STDOUT.
  • | find /v /i труб выход из forfiles to найти здесь /v означает, что не содержит указанную строку и /i значит без учета регистра