Ошибка не найдены файлы отвечающие условиям поиска

Я работаю с пакетным файлом для удаления архивированных документов старше 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


Время на прочтение
10 мин

Количество просмотров 43K

Внимание!

1. Введение

К написанию статьи меня побудило желание внести свои пять копеек в обсуждение одного из последних выпусков (на данный момент) самой популярной среди пользователей операционной системы Windows. А также состояние растерянности и недоумения, если окажется, что описываемый мною ниже баг в системе поиска действительно является «архитектурной особенностью продукта», как мне ответили специалисты поддержки Microsoft. Изложенный ниже материал представлен на основе моих экспериментов с поиском в операционной системе Windows-8-Pro-64bit (установлена самостоятельно на «чистый» ноутбук, лицензионная, активированная). Подобные опыты проводил и ранее на ноутбуке с предустановленной системой Windows-7-HomeBasic-64bit. В обоих случаях результат был одинаков.

По моему мнению, в поисковом модуле указанных выше операционных систем (подозреваю и не в них одних) серьезный баг механизма поиска. Хотя, как я уже упомянул выше, специалисты Microsoft считают, что это не баг, а фича.

Вот кратко суть:

1. Поиск только по именам файлов работает некорректно, а именно – файл будет найден, только если выполняется одно из условий:
a) искомая последовательность символов является началом слова;
b) искомая последовательность символов расположена после некоторых символов типа дефиса, точки, подчеркивания и возможно других.

2. Поиск по именам файлов и содержимому файлов работает некорректно, а именно – файл с нужным нам содержимым будет найден, только если выполняются два условия:
a) тип файла включен в перечень типов, для которых операционная система выполняет текстовый поиск;
b) искомая последовательность символов либо является началом слова, либо расположена после некоторых символов типа дефиса, точки, подчеркивания и возможно других.

Кого это заинтересовало, могут ознакомиться с техническими подробностями моих опытов в изложенном ниже материале.
Небольшое примечание: так как для открытия описываемых мною окон элементов и настроек существует более чем один способ, я избрал как точку отсчета панель управления Windows. Ее можно открыть, нажав сочетание клавиш Win+X и выбрав в появившемся списке пункт «панель управления».

2. Описание системы поиска

Начну с того, что система поиска является компонентом операционной системы. Откроем настройку компонентов Windows: панель управления → программы и компоненты → включение или отключение компонентов Windows. Называется наш компонент – Windows Search. Если его отключить (убрать галочку из соответствующего квадратика), то после перезагрузки родной поиск Windows перестает работать, а из окна проводника исчезает поле для ввода поисковых запросов в правом верхнем углу окна.
КомпонентПоиск

Поле поиска

По умолчанию компонент, естественно, включен. И при вводе первого же символа в поле поиска, система приступает к поиску, не дожидаясь ввода полного запроса. Это так называемый «живой» поиск, сейчас так модно. Вспомним, что в Windows XP для начала процесса поиска было необходимо дать команду – нажать кнопку «Найти».

Составляющей частью системы поиска, служащей для ускорения процесса поиска, является служба индексирования содержимого с аналогичным названием Windows Search, тип запуска – автоматический, отложенный. (На рисунке ниже данная служба отключена).
Служба индекса

Для настройки служб открываем: панель управления → администрирование → службы. Свойства выделенной службы можно посмотреть, открыв контекстное меню – клик правой кнопкой мышки. Как я понимаю, данная служба индексирует определенное содержимое (названия, свойства, содержание файлов) в указанных ей расположениях и заносит эту информацию в свою базу данных. И в последующем поиск происходит уже по этой базе, которая хранится в «C:ProgramDataMicrosoftSearch», тем самым сокращается время поиска.

3. Настройки системы поиска

Настройки поиска сосредоточены аж в трех местах, видимо для удобства. При этом некоторые из них встречаются более чем в одном из этих трех мест, некоторые только в одном. Записываем минус на счет Microsoft. (Некоторые настройки остались для меня загадкой). Вот места расположения этих настроек:
3.1. Панель управления → параметры индексирования;
3.2. Панель управления → параметры папок (вкладка поиск);
3.3. Окно проводника Windows → активируем строку поиска (ставим в нее курсор) → в главном меню окна появляется вкладка «поиск», кликаем ее, если не раскрыта.

Пройдемся по этим местам и кратко рассмотрим параметры поиска.

3.1. Панель управления → параметры индексирования.

В параметрах индексирования нам предоставляется возможность указать, что и где будет индексироваться. Пока плюс в копилку Microsoft. Справка Microsoft не рекомендует выбирать много индексируемых мест, например папки Windows, Program Files, так как, по ее мнению, пользователям там искать нечего. Кроме того индексирование (перестройка индекса) процесс длительный.
Параметры индекса1

Параметры индекса2

Как видно из рисунка каждому типу файла сопоставляется нужный фильтр, а индексировать можно или только свойства файла или и свойства и содержимое. А это значит (о чудо!), что мы, например, можем набрать в строке поиска проводника имя нашего музыкального божества, и он будет найден по музыкальным тэгам. Правда не учитывается состояние/наличие тех самых музыкальных тэгов в наших любимых, часто безликих mp3-файлах. Ведь не редкость и имена типа track_01.mp3.
Кстати путь (расположение) файла – это еще и свойство файла, так что надо быть готовым увидеть в результатах поиска все файлы в пути которых есть слово, набранное в поисковом запросе. По мне, так это уже лишнее.
В итоге мы имеем замудреный поиск. А, как говорит, философия языка Python – простое лучше, чем сложное. Поэтому служба индексирования у меня остановлена.

3.2. Панель управления → параметры папок (вкладка поиск).

В параметрах папок сосредоточены наиболее важные, на мой взгляд, параметры поиска.

Параметры раздела «Как искать» применяются и к индексируемым и к неиндексируемым расположениям. Нужный и понятный всем параметр «Искать частичные совпадения» в комментариях не нуждается. Значение параметра «Не использовать индекс при поиске системных файлов в папках» для меня осталось загадкой. Ведь в параметрах индексирования уже указано, что и как индексировать.

Из названия следует, что параметры раздела «Поиск в неиндексированных расположениях» применяются только к неиндексированным местам.
Значения параметров понятны. В наличии возможность искать в архивах – еще плюс. Следующий важный параметр «Искать по именам файлов и содержимому». Что сказать? Порадовали, и честно предупредили – не все сразу и сейчас.
ПараметрыПапок

3.3. Окно проводника Windows → при активированной строке поиска в главном меню окна появляется вкладка «поиск».

Ну и третье место для настройки параметров поиска любое окно проводника Windows, стоит активировать поле поискового запроса и в главном меню окна появляется вкладка «поиск»:
МенюОкнаПоиск

Здесь много полезных фишек, в том числе только здесь и настраиваемых. Например, поиск только в текущей папке, либо и во всех вложенных тоже. Можно ограничить круг поиска по дате изменения файла, типу, размеру и другим свойствам. Ими я не пользуюсь, дабы потом не терзали сомнения. Фишка повторения поиска в интернетах (однако!), журнал поисковых запросов, а также дополнительные параметры (это как раз те, что мы уже обсудили выше).

4. Устранение неполадок и собственно баг

Начну с того, что в операционную систему встроены модули для поиска и устранения различных проблем. Думаю, фишка нужная, но сразу скажу – меня не спасла.
Итак открываем: панель управления → устранение неполадок → просмотр всех категорий → поиск и индексирование. Почему бы не показать сразу все категории? Не так уж их и много, на мой 14 дюймовый экран помещаются. Запускаем устранение неполадок поиска, в открывшемся окне кликаем «Дополнительно», кликаем «Запуск с правами администратора», кнопка «Далее». Опять новое окно с выбором проблемы, ставим галочку «Файлы не отображаются в результатах поиска» – дошли наконец до моего горя! Жмем «Далее» и получаем вот такой результат работы диагностики:
Диагностика

Как видим это касается службы индексирования (которая в тот момент была включена и работала). Разрешения для каталогов службы индексирования я не трогал, да и не знал о существовании этих каталогов, пока не увидел это окно с результатами диагностики. Напомню, где эти каталоги: «C:ProgramDataMicrosoftSearch».
Способ исправления этой ошибки я не нашел, и думаю уже незачем (служба индексирования у меня ведь отключена теперь). Да и по смыслу следует, что это касается только индексируемых расположений. А моя проблема актуальна для всех расположений.
Настало время детально разъяснить мою проблему. Сразу поясню, что состояние службы индексирования («работает» или «отключена») значения не имеет.

4.1. Поиск по имени файла.

Итак, в первой части эксперимента в глобальных параметрах поиска (относящихся к любым размещениям, индексированным и нет) активируем параметр «Искать частичные совпадения». Далее для неиндексированных расположений (в моем случае – для всех) снимаем галочку «Искать по именам файлов и содержимому», чтобы поиск выполнялся только по именам файлов. Приступаем к опытам. В исследуемой папке размещены несколько файлов различных типов:
ОпытныеФайлы

Набираем в строке поиска fa и видим:
Ex-fa

Казалось бы, Windows Search с задачей справился, даже результаты подсвечены желтым цветом. О чем еще мечтать? Но где же файл SearchFalse.vsd? Разве fa не часть имени SearchFalse.vsd? Может дело в регистре? Но в примере выше найдены имена, где f и в верхнем и в нижнем регистре. Для успокоения введем Fa и увидим, что результат не изменился. Хотя бы с регистром проблем не имеем!

Попробуем ввести cm, получим:
Ex-cm

Как будто-бы все в норме.

Вводим ro:
Ex-ro

«Нет элементов, удовлетворяющих условиям поиска» – как же так, братья и сестры? Три файла удовлетворяют условиям поиска (Error.cmd, Error_critical.txt, Wrong.txt), но они не найдены. Все пропало?
Вот что мы пока имеем: в поле поиска вводится последовательность символов, которая заведомо есть в названии файлов. Но в результатах поиска содержатся только файлы, у которых заданная последовательность является началом имени, или началом расширения, или расположена после дефиса.
Но это противоречит, уверен не только моему, представлению о принципе работы поиска!

Попробуем хитрость, введем первым символом запроса «звездочку» *ro:
-Ex-*ro

Свершилось, файлы найдены! Но уже без чудной желтой подсветки. В справке про такие хитрости нет упоминаний. Развитие событий в целом настораживает.

4.2. Поиск по имени и содержимому файла.

Орешек знаний тверд, но мы не привыкли отступать… Включаем настройку «Искать по именам файлов и содержимому», чтобы теперь искать и по содержанию файла. В уже знакомой нам папке в пяти файлах (Error.cmd, Fail.xlsx, Foul.jpg, Mistake.bat, Wrong.txt) есть одинаковое содержимое:

Get off My Cloud
As Tears Go By
Paint_It_Black
Mother’s Little Helper
Lady-Jane

Файл Foul.jpg – это текстовый файл с измененным расширением.

Набираем в поле поиска tea, (чтобы соответствовало началу слова Tears):
Ex-tea

Вроде бы удача, только файл Foul.jpg не найден. Но это можно объяснить тем, что Windows понятно не считает его текстовым и текст там не ищет. Тут возникают вопросы: где поиск Windows берет информацию о типах файлов и второе, главное, – как заставить искать текст там, где мы этого хотим. Что касается первого – то, видимо, в реестре. А вот со вторым не ясно, где найти эту волшебную настройку? Ответа я опять не нашел. В качестве примечания отмечу, что в файлах .pdf текст найти можно.

Усложним задание, набираем в поле поиска bla, (чтобы символы шли после знака подчеркивания):
Ex-bla

Файлы найдены, но говорить об удаче еще рано. Вводим jan, получаем тот же результат. Что ожидаемо.

Пробуем еще более усложнить задание, набираем запрос ear:
Ex-ear

Те четыре файла, которые должны быть найдены, отсутствуют. Снова неудача, но к которой мы должны быть готовы. У нас есть ответный ход! Вводим *ear:
Ex-*ear

На этот раз неудача, неожидаемая, которая вызывает уже уныние. Неужели тут нужен другой волшебный символ, заменяющий начало слова? Мною опробованы: ~, @, $, %, -, !, даже пробел. Но все тщетно – файлы не найдены. Кстати если ввести впереди дефис, то результат поиска – все файлы кроме pe.pdf, опять загадка.

4.3. Выводы.

На основании всего изложенного выше можно сделать вывод, что механизм поиска одинаков и для поиска по именам файлов и для поиска по именам и содержимому. Ошибка, на мой взгляд, одна и весьма критическая, так как приводит к неполным результатам поиска. Кроме того вводит в заблуждение человека логичного в своем мышлении и вынуждает строить хитрые догадки.
Результат – жирный минус Microsoft. Радует только то, что баг лечится хотя бы для поиска по именам файлов.

5. Диагноз

Можно подвести неутешительные итоги:

1. Поиск только по именам файлов (с выключенным параметром «искать по именам файлов и содержимому») работает некорректно. А именно – файл будет найден, только если выполняется одно из условий:
a) искомая последовательность символов является началом слова;
b) искомая последовательность символов расположена после некоторых символов типа дефиса, точки, подчеркивания и возможно других, определять перечень которых считаю бесполезной тратой времени.

Этот баг лечится использованием в начале искомой последовательности спасительного символа * «звездочка».

2. Поиск по именам файлов и содержимому файлов (с включенным параметром «Искать по именам файлов и содержимому») работает некорректно. А именно – файл с нужным нам содержимым (нас интересует именно содержание файла) будет найден, только если выполняются два условия:
a) тип файла включен в перечень типов, для которых операционная система выполняет текстовый поиск;
b) искомая последовательность символов либо является началом слова, либо расположена после некоторых символов типа дефиса, точки, подчеркивания и возможно других, определять перечень которых считаю бесполезной тратой времени.

Лекарство от этого бага пока мною не найдено.

Чуть не забыл, краткое описание этой проблемы отправлено мною (после проверки подлинности системы) в поддержку Microsoft. Ответ был получен, надо сказать, оперативно, но вера в человечество была потеряна. В ответе сообщалось:
«Информируем Вас о том, что речь идет о нормальной работе продукта — такова его архитектурная особенность. Дополнительную информацию по интересующему Вас вопросу Вы можете найти, обратившись на наши порталы – support.microsoft.com и technet.microsoft.com».
Как жить дальше? Это что – действительно архитектурная особенность или меня вежливо послали? Склоняюсь к мысли, что все же первое. Хотя лучше было бы второе, ведь архитектурные баги, как я понимаю, заплатками не лечатся! Значит минусы уже не пишем – это «Epic Fail»!

6. В качестве заключения кое-какие мысли, в том числе о причинах явления

В операционной системе Windows XP такого поведения системы поиска не наблюдается, поиск работает, как и принято в сфере информационных технологий. Настройки сосредоточены в одном месте и понятны. Разве что поиск не «живой», но мне этот «живой» поиск только мешает: я еще не ввел запрос, а какие-то потуги уже начинаются. В поиске Google эта фишка хоть отключается. Похоже, спецам Microsoft было поручено внедрить какую-нибудь инновацию и в систему поиска. Так «оживили» бы его, да плюс сделали прикольную подсветку результатов – и всем счастье! Зачем же ломать сам принцип, зачем трогать основы? Инновационный поиск, открываемый из боковой панели Windows 8, ищет файлы только в индексированных расположениях, с учетом бага, его ценность для меня теряется.
Еще небольшое замечание и заканчиваю. Пока гуглил свою проблему прочитал ряд статей Вадима Стеркина (aka Vadikan на oszone.net). Например: http://www.outsidethebox.ms/9973/ и http://www.oszone.net/10893/Windows7_Search_Part2. В его блоге и на форуме oszone.net прямо хвалебные песни о Microsoft. Справедливости ради надо сказать, что в статьях содержится нужная и полезная информация. Но вот в отношении Windows Search складывается впечатление, что сознательно оставлены за кадром примеры поиска, когда искомая последовательность символов расположена, скажем в конце слова. Невольно вспоминается басня про кукушку и петуха…

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%

Я работаю с пакетным файлом для удаления заархивированных документов старше 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

Сам скрипт, если его руками запустить, работает и делает бэкапы без проблем.

После создания задания, в планировщике нажал кнопку «Выполнить» скрипт запустил с черным окном командной строки. Соответственно планировщик скрипт в планировщике работает.

Сегодня с утра прихожу к ПК пользователя, смотрю бэкапы на Е, их нет.

Смотрю журнал планировщика, а в нем даже и записей нет, что он пытался запуститься, т.е как будто вообще не пытался.

В планировщике стоит, чтобы использовал учетную запись — Администратор

В чем я ошибся при настройке?

Спасибо!

Понравилась статья? Поделить с друзьями:
  • Ошибка не найдено ни одного файла isarcextract
  • Ошибка не найдено имя группы
  • Ошибка не найдена конфигурация виджета
  • Ошибка не найдена вкладка листа автокад
  • Ошибка не найден файл зона