1

вот что я пытаюсь сделать:

Используйте команду forfiles в сценарии .cmd для удаления папок по указанному пути, которые старше, например, 2 дня на машине win7.

Изменить: Ситуация следующая по пути X:\ резервные копии - это папки, которые содержат ежедневные резервные копии, например 25.06.2014 следующая папка 24.06.2014 и тд.

Мои вопросы по этому поводу сейчас:

  • /d в справке всегда подчеркивает --files--. Так что я не уверен, что это работает и для папок.
  • особенно я не уверен, что он будет делать в сочетании с / с. Так что он будет просто проходить через папки и удалять файлы - но что, если родительская папка уже слишком старая? Что касается текста, то концепция рекурсии мне не ясна, и что это значит, я не смог выяснить. Это просто значит проходить по папкам, верно?
  • Если бы я использовал IF-Statement, мне пришлось бы использовать 2 переменные @ISDIR и @FDATE. С этим решением я не знаю, как объединить 2 If-Statements в команде forfiles и, кроме того, я не уверен, что @FDATE снова только для файлов, а не папок.

Так как это сделать правильно?

Ссылка на файлы:http://technet.microsoft.com/de-de/library/cc753551%28v=ws.10%29.aspx

Привет!

3 ответа3

6

Решение

Несмотря на свое имя, команда forfiles может обрабатывать как файлы, так и папки. Вот пакетный скрипт, который делает эту работу:

@echo off
setlocal

set target=X:\backups
set days=-2

for /f "usebackq delims=" %%G in (
`forfiles /p "%target%" /c "cmd /c if /i @isdir == true echo @path" /d %days% 2^>nul`
) do echo rd /s /q "%%~G"

pause
endlocal & exit /b

Как это устроено

Прежде всего, переменные target и days инициализируются. Первая - это папка, которую вы хотите сканировать, а вторая - количество дней. Отрицательные значения означают, что они старше или равны.

Затем выполняется команда forfiles , указывая папку и количество дней, которые были установлены ранее. Для каждого результата проверяется специальная переменная @isdir : если значение равно true текущая запись является папкой, а ее @path . Выходные данные команды затем анализируются, чтобы получить все соответствующие папки и удалить их. По соображениям безопасности, есть дополнительная команда echo чтобы вы могли проверить, удаляются ли нужные папки.

При использовании рекурсивного ключа (/s) обрабатываются все файлы, папки и их подпапки. В этом случае вы не хотите; в противном случае вы можете удалить старые подпапки, содержащиеся в более новых папках, к которым не следует прикасаться.

дальнейшее чтение

1

PowerShell, состоящий из одной строки, не совсем подходит для вас. Он не включает полный путь к списку файлов. Кроме того, вам может потребоваться рекурсия. Это работает:


get-childitem "D: \ backup" |? {$ .psiscontainer -and $ .lastwritetime -le (get-date) .adddays (-0)} |% {remove-item D: \ backup \ $ _ -force -recurse -whatif}
0

Вот однострочный подход PowerShell:

get-childitem "x:\backups" |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays(-2)} |% {remove-item $_ -force -whatif}

Вы можете настроить возрастной порог с помощью параметра adddays. Это все еще в режиме "WhatIf", поэтому вы можете сначала проверить его и посмотреть, что произойдет. Удалите -whatif, чтобы он действительно удалял папки.

Источник: TechNet Forum

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .