Я работаю с пакетным файлом для удаления архивированных документов старше 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:WindowsSystem32
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:WindowsSystem32
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:SQLADMINMAINTREPORTSSQL2" /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
значит без учета регистра
1
автор: Christiaan Westerbeek
Might I add a humble contribution to this already valuable thread. I’m finding that other solutions might get rid of the actual error text but are ignoring the %ERRORLEVEL% which signals a fail in my application. AND I legitimately want %ERRORLEVEL% just as long as it isn’t the «No files found» error.
Some Examples:
Debugging and eliminating the error specifically:
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
Using a oneliner to return ERRORLEVEL success or failure:
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
Using a oneliner to keep the ERRORLEVEL at zero for success within the context of a batchfile in the midst of other code (ver > nul resets the 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||ver > nul
For a SQL Server Agent CmdExec job step I landed on the following. I don’t know if it’s a bug, but the CmdExec within the step only recognizes the first line of code:
cmd /e:on /c "forfiles /p "C:SQLADMINMAINTREPORTSSQL2" /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 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
|
1 |
|
05.10.2011, 07:53. Показов 14039. Ответов 19
Добрый день. 1) Хочу удалить папки, вместе с внутренними файлами, которые были созданы — 14 дней назад. forfiles.exe /p Z:0004110processed /s /d -14 /c «cmd /c del /q /f @file» 3) Вместо пункта 2 есть идея переименовывать файл перед удалением.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
05.10.2011, 07:53 |
19 |
835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
|
05.10.2011, 15:24 |
2 |
Ну проще всего будет вариант добавить к этому коду удаление пустых папок. Для использования русских имен файлов понадобиться еще одна команда в начале chcp 1251
1 |
r18romik 0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
||||
06.10.2011, 07:53 [ТС] |
3 |
|||
Делаю так, но при установки chcp 1251 русская буква Д заменяется на символ — и скрипт выдаёт ошибку, что указанный каталог не найден. Добавлено через 5 минут
0 |
835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
|
06.10.2011, 09:05 |
4 |
Ну вообще очень странно что у вас chcp 1251 не работает. Еще @FILE и @PATH кажется нужно большими буквами писать а то не работает.(по крайней мере в версии для xp) Для универсальности кода если файлы или папки будут с пробелами можно написать так
1 |
0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
|
06.10.2011, 09:33 [ТС] |
5 |
Локально выполнял на viste. Миниатюры
0 |
0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
|
06.10.2011, 09:39 [ТС] |
6 |
Вот скрин когда через notepad кодировку меняю… Миниатюры
0 |
atributz 835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
||||||||
06.10.2011, 09:54 |
7 |
|||||||
Добавлено через 1 минуту Добавлено через 6 минут Добавлено через 4 минуты
0 |
835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
|
06.10.2011, 09:57 |
8 |
0 |
r18romik 0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
||||
06.10.2011, 11:14 [ТС] |
9 |
|||
Получилось так. 1 — удаление файов 2 — удаление пустых папок На скрине видно, что первое задание вроде выполняется, но по факту папки не удаляются. Дерево в каталоге Z:„0000911processed такое: :„0000911processedПапкаПапкаФайл Миниатюры
0 |
835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
|
06.10.2011, 18:53 |
10 |
В конце названия папки слеш уберите его там быть не должно.
0 |
r18romik 0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
||||||||
07.10.2011, 14:31 [ТС] |
11 |
|||||||
Сдела как Вы сказали. Процесс пошёл, но выдаёт ошибку: Не найдены файлы отвечающие условиям поиска.
Добавлено через 8 минут
0 |
atributz 835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
||||
07.10.2011, 14:38 |
12 |
|||
Вы наверно куда то торопитесь поскольку в вашем коде лишняя строка
0 |
r18romik 0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
||||
07.10.2011, 14:54 [ТС] |
13 |
|||
Нее она не лишняя Вот весь скрипт:
0 |
835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
|
07.10.2011, 15:06 |
14 |
может тогда проще будет удалять файлы по времени а потом все пустые папки?
0 |
sov44 1778 / 760 / 130 Регистрация: 09.04.2011 Сообщений: 1,325 |
||||||||
09.10.2011, 20:04 |
15 |
|||||||
Подскажите, почему не передаётся в Echo второй параметр «temporary_downloads» ?
Добавлено через 1 час 35 минут Добавлено через 2 часа 38 минут
0 |
atributz 835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
||||
09.10.2011, 23:59 |
16 |
|||
вывести в Echo имена всех разделов, которые начинаются на КВ
0 |
r18romik 0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
||||||||
11.10.2011, 06:50 [ТС] |
17 |
|||||||
Убрал период в строке: forfiles.exe /p %1 /s /c «cmd /c del /q /f «@FILE» & rd «@FILE»»
Добавлено через 8 минут
Добавлено через 21 час 45 минут
0 |
atributz 835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
||||
11.10.2011, 15:00 |
18 |
|||
forfiles перебирает одновременно и папки и файлы Может подойдет вариант удалить папки созданные n дней назад.
0 |
r18romik 0 / 0 / 0 Регистрация: 05.10.2011 Сообщений: 18 |
||||
12.10.2011, 07:51 [ТС] |
19 |
|||
Не работает. Пишет Не допустимый ключ «05-32» — это папка. Z:„00004779processed12.10.20115-32Файл.zip Миниатюры
0 |
atributz 835 / 349 / 12 Регистрация: 04.10.2009 Сообщений: 589 |
||||
12.10.2011, 09:17 |
20 |
|||
а он сам кавычки ставит.
0 |
Я работаю с пакетным файлом для удаления заархивированных документов старше 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"
Проблема в том, что сценарий возвращает код ошибки и печатает «ОШИБКА: файлы не найдены с указанными критериями поиска», если он не находит файлов для удаления, когда я действительно хочу, чтобы он возвращал ошибку только в случае возникновения проблемы. доступ к каталогу или выполнение команды del и т. д. Есть ли способ заставить этот скрипт подавить ошибку «файлы не найдены», но позволить другим пройти?
После некоторого поиска в Google я попробовал решения на этой странице, но они не будет работать для того, что я хочу, поскольку в первом случае он подавляет ВСЕ ошибки, а во втором передается текст сообщения об ошибке, но фактический код возврата по-прежнему подавляется (это то, что читает процесс автоматизации).
8 ответов
Лучший ответ
Решение состоит в том, чтобы захватить вывод команды FORFILES в цикле FOR, найти в нем строки, начинающиеся с ERROR, и сохранить результат в переменной. Оттуда вы можете использовать директивы IF / ELSE для соответствующей установки errorlevel
. Вот код (без протоколирования и комментариев):
cd /d C:WindowsSystem32
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 исключены все символы, такие как >&|
.
6
Malcolm
4 Июл 2014 в 02:03
Это должно решить эту проблему:
@echo off
Echo Deleting files older than 14 days...
cd /d C:WindowsSystem32
copy /b forfiles.exe "[file path...]IDOC_ARCHIVE" >nul
FORFILES /P "[file path...]IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file"
Он предоставляет файл старше 14 дней, поэтому он всегда будет удален, а сообщение «Файлы не найдены» не появится. Я выбрал для копирования forfiles.exe, но вы можете использовать любой файл старше 14 дней. Все остальные сообщения об ошибках будут отображаться как обычно.
15
VLL
10 Май 2019 в 15:03
Добавление 2> nul помогло. Спасибо!
Forfiles / p d: todayfiles / d +0 / c «cmd / c echo @path» 2> nul | найти «:» / c
Это в основном подавляет поток ошибок этой команды. Так что даже если при выполнении этой операции возникли другие ошибки, они не появятся!
10
Hazem Elraffiee
18 Июл 2019 в 13:54
Чтобы надежно повлиять на УРОВЕНЬ ОШИБКИ, вам необходимо выполнить следующую команду, которая гарантированно установит ERRORLEVEL в 0. Я использую сам интерпретатор команд (cmd.exe), чтобы сделать это, как показано в следующем фрагменте:
FORFILES /M:somefiles /D -14 2>nul | cmd /c ""
Надеюсь, это кому-то поможет.
6
Nigel
24 Окт 2013 в 14:17
Могу я добавить скромный вклад в эту уже ценную ветку. Я обнаружил, что другие решения могут избавиться от фактического текста ошибки, но игнорируют% 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
Использование единственной строки для возврата 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
Использование единственной строки для поддержания уровня ERRORLEVEL равным нулю для успеха в контексте пакетного файла среди другого кода (ver> nul сбрасывает 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||ver > nul
На этапе задания CmdExec агента SQL Server я остановился на следующем. Я не знаю, ошибка ли это, но CmdExec на шаге распознает только первую строку кода:
cmd /e:on /c "forfiles /p "C:SQLADMINMAINTREPORTSSQL2" /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%
4
Sting
8 Апр 2015 в 16:17
Это легко решается одним лайнером. Просто добавьте это в свою команду 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, чтобы найти где/v
означает НЕ содержащий указанную строку, а/i
означает регистронезависимый
4
Christiaan Westerbeek
27 Июн 2014 в 11:08
Попробуйте добавить после скрипта
2>Nul
Примере
SET Days=14
FORFILES /S /M *.* /D -%Days% /C "CMD /C DEL @file" 2>Nul
Надеюсь, это поможет.
1
Siya Matsakarn
4 Июл 2019 в 08:11
У меня была такая же проблема при попытке удалить дубликаты в ежегодных резервных копиях на моем внешнем жестком диске. Ни одно из решений, найденных при поиске в Интернете (добавление @path
, исключение cmd /c
в параметре команды), не помогло мне. Система, спрашивающая «Вы уверены …», подсказала мне следующее решение: использовать параметр /q
. Результат стирает файлы 2015 в моем каталоге 2016:
forfiles /p G:YearlyBUMine16-12-29IMeMineDocuments /s /c "cmd /c del @path @file /q" /d -1100
0
Stephan
22 Янв 2019 в 17:38
Подскажите, пожалуйста, по работе планировщика в редакции Home&Biesness
На ПК пользователя подключен сетевой диск (буква М) на котором лежат файловые базы 1С
В 1С прописаны базы: M:Base1CИмя_базы
На диске С этого же ПК создана папка Script1C, в которой лежит скрипт по резервному копированию баз 1С на отдельный диск этого же ПК (буква Е)
Пользователь не имеет админских прав на ПК. Сам ПК в рабочей группе.
Я настроил ПК на самостоятельное включение в 23:00.
По админской учетной записью настроил планировщик для запуска скрипта из папки C:Script1C в 23:10
Сам скрипт, если его руками запустить, работает и делает бэкапы без проблем.
После создания задания, в планировщике нажал кнопку «Выполнить» скрипт запустил с черным окном командной строки. Соответственно планировщик скрипт в планировщике работает.
Сегодня с утра прихожу к ПК пользователя, смотрю бэкапы на Е, их нет.
Смотрю журнал планировщика, а в нем даже и записей нет, что он пытался запуститься, т.е как будто вообще не пытался.
В планировщике стоит, чтобы использовал учетную запись — Администратор
В чем я ошибся при настройке?
Спасибо!