Удалить подпапку с определенным именем старше указанной даты из подпапок - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть несколько сетевых дисков, файлы и подпапки которых старше определенной даты, которые обычно удаляются.

Для удаления подпапок я обычно использую что-то вроде этого (после сопоставления общего сетевого ресурса с R :): forfiles /P "R:" /D -200 /C "cmd /c IF @isdir == TRUE rd /S /Q @path" >> %backuplog% 2>&1

Тем не менее, у меня есть структура папок, которая теперь заполняется папками с непредсказуемыми именами (поэтому я не мог сопоставить их напрямую очень легко), например,

R:/423423423/SIS.d/
R:/543543534/SIS.d/
R:/765465477/SIS.d/

каждая из подпапок в R: имеет несколько файлов и папок, но я хотел бы удалить из них все подпапки с именем SIS.d старше 6 месяцев. Можно ли изменить команду forfiles, чтобы сделать это? Если нет, может кто-нибудь помочь с другим методом?

Могу ли я использовать что-то вроде /m */SIS.d/*.*?

спасибо, Фил

1 Ответ

0 голосов
/ 13 ноября 2018

Да, для этой задачи можно использовать команду FORFILES , несмотря на ее имя.

%SystemRoot%\System32\forfiles.exe /P "R:\" /M "SIS.d" /S /D -200 /C "%ComSpec% /C if @isdir == TRUE rd /S /Q @path >>"%backuplog%" 2>&1" 2>nul

FORFILES поиск

  • в корневом каталоге диска R: из-за опции /P "R:\"
  • и всех ее подкаталогов из-за опции /S
  • для записи (файла или каталога), соответствующей регистронезависимомумаска поиска SIS.d из-за того, что /M "SIS.d"
  • старше 200 дней из-за /D -200 по дате последнего изменения

и выполняется для каждой найденной записи из-за опции /C "..." командная строка:

C:\Windows\System32\cmd.exe /C if @isdir == TRUE rd /S /Q @path >>"%backuplog%" 2>&1

%backuplog% также раскрывается перед выполнением команды forfiles и, надеюсь, расширяется до полного имени файла без заключения в двойные кавычки, указанные дополнительно в командной строке.

cmd.exe первый запуск команды IF для сравнения с учетом регистра, если строка, переданная forfiles с @isdir команде, равна строке TRUE.

В этой строке сравнения условийв случае истинности cmd.exe запускает команду RD для тихого удаления каталога со всеми его подкаталогами и файлами, указанными с полным квалифицированным именем каталога, на которое ссылается @path и передается forfiles в cmd.exe всегдазаключены в двойные кавычки.

Стандартный вывод и вывод ошибки команды RD перенаправляются в файл, имя которого присвоено переменной среды backuplog.Команда RD никогда не выводит что-либо для обработки STDOUT при использовании опций /S и /Q. RD выведет сообщение об ошибке для обработки STDERR , если полное удаление каталога не удастся по различным причинам.Таким образом, было бы достаточно использовать 2>>"%backuplog%" вместо >>"%backuplog%" 2>&1.

Полное удаление каталога, обрабатываемого в настоящее время forfiles, приводит к сообщению об ошибке forfiles для обработки STDERR, который подавляется дополнительными 2>nul в конце командной строки forfiles.

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

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

  • cmd /?
  • forfiles /?
  • if /?
  • rd /?

См. Также статью Microsoft о Использование операторов перенаправления команд .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...