Разработайте пакетный файл для очистки подкаталога с подтверждением

Обновлено: 02.07.2024

В этом руководстве мы объясним, как создать пакетный файл для автоматического удаления папки с помощью CMD (командной строки). Мы продолжим серию руководств по использованию командного файла. Команда удалит все файлы и подпапки в указанной папке.

Этот пакетный файл может быть очень полезен, если необходимо удалить большие папки. Использование командной строки может быть более чем в 20 раз быстрее, чем использование самого проводника Windows. Наконец, очистка папки загрузки без необходимости вручную заботиться о ней каждую неделю или месяц — это облегчение. Кроме того, это можно сделать, запланировав этот пакетный файл для удаления папки в планировщике задач Windows.

Предыдущие руководства по пакетным файлам:

    - Удаляйте файлы старше 7 дней, используя пакет и скрипт. – Удалить файл с помощью командной строки. – Скрипт для архивирования файлов с помощью команды cmd.

Как создать пакетный файл для удаления папки с помощью CMD.

  1. Создайте текстовый файл и скопируйте приведенную ниже командную строку:
  2. Сохранить как DeleteFolder.bat. Сохраняйте в любом месте, кроме папки D:\testfolder.
  3. Запустите пакет двойным щелчком и проверьте, не была ли папка удалена.

пакетный файл удалить папку

Пакетный файл для удаления папки

В этом случае мы удалим указанную папку. В нашем примере мы настроили пакетный файл для удаления «тестовой папки», расположенной в папке D.

Объяснение пакетных команд.

“D:\testfolder” Основная команда находит папку.

Параметр

/s удалит все файлы, содержащиеся в подпапках каталога. Однако, если вы не хотите удалять файлы из подпапок, удалите параметр /s.

Параметр

/f игнорирует любые настройки, доступные только для чтения.

/q «тихий режим» означает, что вам не будет предложено Да/Нет

Планирование пакета.

В противном случае этот пакетный файл можно запланировать в планировщике задач Windows для автоматического запуска. Для получения дополнительной информации нажмите на предыдущий пост: здесь

Скажем, есть переменная с именем %pathtofolder% , так как она дает понять, что это полный путь к папке.

Я хочу удалить каждый файл и подпапку в этом каталоге, но не сам каталог.

Однако может возникнуть ошибка типа "этот файл/папка уже используется". когда это произойдет, он должен просто продолжить и пропустить этот файл/папку.

Есть ли для этого какая-то команда?

Невероятно, насколько сложно Windows удаляет папки. Или сделать тот, который начинается с точки. Слава Богу за интеграцию Bash в Windows! rm -rf путь\к\папке работает в Windows 10 (или может исходить из Git Bash. В любом случае, если он у вас есть, стоит попробовать!)

15 ответов 15

rmdir — моя самая любимая команда для работы. Он работает для удаления огромных файлов и папок с подпапками. Резервная копия не создается, поэтому перед запуском этой команды убедитесь, что вы безопасно скопировали файлы.

Это автоматически удалит папку, все файлы и подпапки.

Это приведет к удалению самой папки, поэтому вам нужно будет добавить еще одну команду: md FOLDERNAME (см. ответ @rakoczyn ниже).

Что вы подразумеваете под "резервной копией создана"? Я не вижу ничего, что могло бы создать какую-либо резервную копию.

Чтобы не удалять саму папку, сначала сделайте ее текущей директорией, а затем используйте "." как ИМЯ ПАПКИ. Его повторное создание впоследствии не обязательно одно и то же, потому что ACL могут быть потеряны. cd "ИМЯ ПАПКИ" RD . /С /К

Вы можете использовать этот сценарий оболочки для очистки папки и файлов в источнике C:\Temp:

Создайте пакетный файл (скажем, delete.bat), содержащий приведенную выше команду. Перейдите в папку, где находится файл delete.bat, а затем выполните команду: delete.bat

Я пробовал, но, к сожалению, файлы не удаляются, удаляются только подпапки. Например, у меня есть папка с именем Test. Он содержит 2 папки с именами «Ripon» и «Wasim», а также файл с именем «riponalwasim.txt». Подпапки Ripon и Wasim были удалены, но riponalwasim.txt не был удален.

Печально, что это занимает 2 строки, но, по крайней мере, это работает! Я устал искать работающую "однострочникку" и возьму эту, спасибо!

Вы можете использовать оператор '&&' для выполнения двух команд в одной строке без bat-файла (обратите внимание на один '%' вместо '%%'). del /s /q "myfolder*" && FOR /D %p IN ("myfolder*") DO rmdir "%p" /s /q

В командной строке DEL отсутствует параметр /A для удаления также файлов с установленным скрытым атрибутом и параметр /F для удаления также файлов с установленным атрибутом только для чтения. Так что del /A /F /Q "C:\Temp\*" будет лучше.И командную строку FOR следует изменить на for /F "eol=| delims=" %%I in ('dir "C:\Temp\*" /AD /B 2^>nul') do rd /Q /S " C:\Temp\%%I", потому что FOR игнорирует каталоги со скрытым набором атрибутов. DIR с параметрами /AD /B выводит все каталоги в C:\Temp только с их именами.

Самое простое решение, которое я могу придумать, это удалить весь каталог с помощью

Затем снова создайте этот каталог:

Это плохое решение, так как оно приводит к гонке в файловой системе за узел каталога, т. е. вторая команда может завершиться ошибкой, если будет выполнена сразу после нее.

RD и RMDIR — это одна и та же команда, и, поскольку вы опубликовали этот ответ через 9 месяцев после того, как кто-то дал тот же ответ, почему люди ставят вам баллы?

При этом папки и файлы будут удалены, а папка останется.

Для тех, кто не уверен в этом подходе: он определенно не создает каталог заново. Без 2>nul выводится «Процесс не может получить доступ к файлу, поскольку он используется другим процессом».

Мне не нравится, что Windows не может удалять файлы и папки, используемые какой-либо программой. И мне нравится, что вы использовали это в свою пользу в этой остроте.

@mlvljr Только если вы хотите сохранить и родительскую папку. РД/? покажет вам простой способ очистить папку.

Это хорошо, если вам нужно вернуться в исходное местоположение, в противном случае просто CD mypath && RD /S . было бы достаточно. Мне не нравится, что вам нужно дважды повторить свой путь, потому что для длинных путей становится трудно читать. Поэтому я бы просто добавил набор p="mypath" в начале.

<р>. удаляет все файлы и папки в данном каталоге, но не сам каталог.

это должен быть правильный ответ.. просто упростите.. удалите файл myfoldercontents.bat.. вставьте свой путь, и он работает как шарм..

В командной строке DEL отсутствует параметр /A для удаления также файлов со скрытым набором атрибутов, а %dir%\* должен быть заключен в двойные кавычки, например "%dir%\*", чтобы работать также с каталогами, содержащими пробел или один из эти символы &()[]<>^=;!'+,`~ . И командную строку FOR следует изменить на for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "% dir%\%%I", потому что FOR игнорирует каталоги со скрытым набором атрибутов. DIR с параметрами /AD /B выводит все каталоги только с их именами. КСТАТИ: dir не является хорошим именем для переменной окружения.

@RMiranda, в моих тестах он работает точно так, как просил ОП. У вас есть случай, когда он не удаляет подпапки?

Отвечает ли этот ответ на требование "может возникнуть ошибка типа "этот файл/папка уже используется". Когда это произойдет, он должен просто продолжить и пропустить этот файл/папку." ?

Вы получите сообщение об ошибке, в котором говорится, что команда RMDIR не может получить доступ к текущей папке, поэтому она не может ее удалить.

Обновление:

Из этого полезного комментария (спасибо Moritz Both) вы можете добавить && между ними, чтобы RMDIR не запускался в случае сбоя команды CD (например, неправильное имя каталога):

/S: Удаляет дерево каталогов (указанный каталог и все его подкаталоги, включая все файлы).

/Q: Указывает тихий режим. Не запрашивает подтверждение при удалении дерева каталогов. (Обратите внимание, что /q работает, только если указан /s.)

Это идеально подходит для очистки временных файлов, но этот cd [Your_Folder] очень важен — мне нужно помнить об этом, чтобы не удалять сам каталог.

Это правильное решение. Добавьте && между командами вместо разрыва строки, и вы застрахованы от неудачного компакт-диска.

довольно плохое решение. Мне, например, нужно это удаление из командной строки для обновления svn — я хочу удалить все файлы и папки, прежде чем делать обновление svn, потому что на машине, где я это использую, могут быть некоторые изменения, но актуальны только отмеченные элементы . Выполнение RMDIR /S /Q . также удаляет ссылку SVN и, следовательно, делает папку больше не папкой svn

Я использую Powershell

Он удалит содержимое папки, а не саму папку.

Ответ rellem недавний, но это единственный ответ, который действительно сделает это для меня. (Win 8.1, не по выбору)

Простое решение с одной командной строкой, которое, конечно, также можно использовать в пакетном файле:

Эта командная строка содержит три команды, выполняемые одна за другой.

Первая команда PUSHD помещает текущий путь к каталогу в стек, а следующая делает %PathToFolder% текущим каталогом для выполнения командного процесса.

Это работает также для путей UNC по умолчанию, поскольку расширения команд включены по умолчанию, и в этом случае PUSHD создает временную букву диска, которая указывает на указанный сетевой ресурс, а затем изменяет текущий диск и каталог, используя вновь определенный диск. письмо.

PUSHD выводит следующее сообщение об ошибке для обработки STDERR, если указанный каталог вообще не существует:

Система не может найти указанный путь.

Это сообщение об ошибке подавляется перенаправлением с помощью 2>nul на устройство NUL.

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

Команда RD с параметрами /Q и /S незаметно удаляет каталог со всеми подкаталогами, даже если указанный каталог содержит файлы или папки со скрытым атрибутом или с установленным атрибутом только для чтения. Системный атрибут никогда не препятствует удалению файла или папки.

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

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

Файлы/папки, для которых текущий пользователь не имеет необходимых (NTFS) разрешений для удаления файла/папки, что также предотвращает удаление дерева папок для этого файла/папки.

Первая причина отказа от удаления папки используется этой командной строкой для удаления всех файлов и подпапок указанной папки, но не самой папки. Папка временно становится текущим каталогом для выполнения командного процесса, что предотвращает удаление самой папки. Разумеется, это приводит к выводу сообщения об ошибке командой RD:

Процесс не может получить доступ к файлу, поскольку он используется другим процессом.

Файл здесь неправильный термин, так как на самом деле папка используется другим процессом, текущим командным процессом, который выполнил команду RD. Что ж, на самом деле папка для файловой системы — это специальный файл с атрибутом файла directory, что и объясняет это сообщение об ошибке. Но я не хочу слишком углубляться в управление файловой системой.

Это сообщение об ошибке, как и все другие сообщения об ошибках, которые могут появиться из-за трех причин, описанных выше, подавляется путем перенаправления с помощью 2>nul с дескриптора STDERR на NUL устройства.

Третья команда, POPD, выполняется независимо от значения выхода команды RD.

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

Примечание: POPD может автоматически не восстановить исходный текущий каталог, если исходный текущий каталог был подкаталогом удаляемого каталога, который больше не существует. В этом особом случае %PathToFolder% остается текущим каталогом. Поэтому рекомендуется запускать приведенную выше командную строку не из подкаталога %PathToFolder% .

Еще один интересный факт: я попробовал командную строку, также используя путь UNC, поделившись локальным каталогом C:\Temp с общим именем Temp и используя путь UNC \\%COMPUTERNAME%\Temp\CleanTest. назначается переменной среды PathToFolder в Windows 7. Если текущий каталог при запуске командной строки является подкаталогом общей локальной папки, доступ к которой осуществляется с использованием пути UNC, т. е. C:\Temp\CleanTest\Subfolder1 , Subfolder1 удаляется RD, а следующий POPD автоматически не удается сделать C:\Temp\CleanTest\Subfolder1 снова текущим каталогом, в результате чего Z:\CleanTest остается текущим каталогом для выполняемого командного процесса. Таким образом, в этом очень, очень частном случае буква временного диска остается до тех пор, пока текущий каталог не будет изменен, например, с помощью cd /D %SystemRoot% на реально существующий локальный каталог. К сожалению, POPD не завершается со значением больше 0, если ему не удается восстановить начальный текущий каталог, что делает невозможным обнаружение этого особого состояния ошибки, используя только код выхода POPD. Однако можно предположить, что никто никогда не сталкивался с этим особым случаем ошибки, поскольку UNC-пути обычно не используются для доступа к локальным файлам и папкам.

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

Далее рассмотрим решение для пакетного файла, используя команду DEL для удаления файлов в %PathToFolder% и FOR и RD для удаления подпапок в %PathToFolder% .

Пакетный файл сначала проверяет, действительно ли переменная среды PathToFolder определена путем к папке без двойных кавычек и обратной косой черты в конце. Обратная косая черта в конце не будет проблемой, но двойные кавычки в пути к папке могут быть проблематичными, поскольку значение PathToFolder объединяется с другими строками во время выполнения пакетного файла.

Важны две строки:

Команда DEL используется для удаления всех файлов в указанном каталоге.

  • Опция /A необходима для обработки действительно всех файлов, включая файлы со скрытым атрибутом, который DEL проигнорирует без использования опции /A.
  • Параметр /F необходим для принудительного удаления файлов с установленным атрибутом только для чтения.
  • Параметр /Q необходим для запуска скрытого удаления нескольких файлов без запроса пользователю, действительно ли нужно удалить несколько файлов.
  • >nul необходим для перенаправления вывода имен файлов, записанных для обработки STDOUT, на устройство NUL, которое не может быть удалено из-за того, что файл в данный момент открыт или у пользователя нет прав на удаление файла.
  • 2>nul необходим для перенаправления вывода сообщения об ошибке для каждого файла, который не может быть удален, из дескриптора STDERR на устройство NUL.

Команды FOR и RD используются для удаления всех подкаталогов в указанном каталоге. Но for /D не используется, так как FOR игнорирует в этом случае подкаталоги с установленным атрибутом hidden. По этой причине /F используется для запуска следующей командной строки в отдельном командном процессе, запущенном в фоновом режиме с помощью %ComSpec% /c :

DIR выводит в чистом формате из-за /B записи каталога с атрибутом D , т. е. имена всех подкаталогов в указанном каталоге, независимые от других атрибутов, таких как скрытый атрибут без пути. 2> nul используется для перенаправления сообщения об ошибке, выводимого DIR в каталоге, не найденном из дескриптора STDERR на устройство NUL.

Оператор перенаправления > должен быть экранирован символом вставки ^ в командной строке FOR, чтобы он интерпретировался как буквальный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную командную строку dir. в отдельном командном процессе, запущенном в фоновом режиме.

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

FOR с параметром /F игнорирует пустые строки, которых здесь нет, поскольку DIR с параметром /B не выводит пустые строки.

FOR также игнорирует строки, начинающиеся с точки с запятой, которая по умолчанию является символом конца строки. Имя каталога может начинаться с точки с запятой. По этой причине eol=| используется для определения символа вертикальной черты как символа конца строки, который не может быть в имени каталога или файла.

FOR разделит строку на подстроки, используя пробел и горизонтальную табуляцию в качестве разделителей, и назначит только первую строку, разделенную пробелом/табуляцией, указанной переменной цикла I . Такое поведение разделения здесь нежелательно, поскольку имя каталога может содержать один или несколько пробелов. Поэтому delims= используется для определения пустого списка разделителей, чтобы отключить поведение разделения строк и присвоить переменной цикла I , всегда полное имя каталога.

Команда FOR запускает команду RD для каждого имени каталога без пути, поэтому в командной строке RD необходимо еще раз указать путь к папке, который объединяется с именем подпапки.

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

Кто-нибудь знает эффективный способ удаления файлов и подпапок в общей папке, но не удаления корневой папки?

моя цель - создать пакетный файл, который запускается каждую пятницу вечером как запланированное задание, которое удаляет содержимое общей папки (файлы и подпапки) без удаления корневого каталога, факт использования команды "md" не вернется одинаковые права доступа.

Заранее благодарим вас за помощь.

Ответы

Вот сценарий оболочки (командный файл .cmd), который я использовал в течение нескольких лет:

Все ответы

Вот сценарий оболочки (командный файл .cmd), который я использовал в течение нескольких лет:

Большое спасибо! ! Я протестировал его, и он работает отлично! Мне все еще нужно запрограммировать его как запланированное задание.

Всем доброго дня!

Это именно то, что делает мой (rd /q /s .).

Не беспокойтесь — просто хотел указать на сходство — два разных способа сказать одно и то же.

Мой сценарий написан таким образом, что он принимает аргумент командной строки. Если вы сохраните сценарий как CleanDir.cmd, запланируйте сценарий следующим образом (например):

Конечно, запланированная задача должна выполняться с использованием учетной записи с достаточными разрешениями.

Прости, Билл. Немного запутался. Куда мне поместить «C:\Scripts\CleanDir.cmd \\crdr661a.cr.trapezits.com\didk5004»? Я помещаю это в сценарий? Если да, то где это происходит в вашем сценарии? Извините, со скриптами особо не сталкивался, так что совсем нуб.

<р>. это то, что вы бы запланировали как запланированную задачу (конечно, при условии, что вы поместили файл сценария CleanDir.cmd в C:\Scripts).

Если вы не знакомы с планировщиком задач, спросите об этом на соответствующем форуме.

Я не уверен, где указать путь к папке в вашем скрипте? Этот скрипт должен быть назван с расширением .bat. Должен ли скрипт располагаться где-то в соответствии с переменной окружения path?

В этой теме уже есть ответ на ваш вопрос.

сэр, я использовал этот синтаксис, но элементы рабочего стола удаляются вместо удаления файла из папки c:\program files\pointofsale

и я хочу вернуть эти файлы. как их получить?

Здравствуйте,

сэр, я использовал этот синтаксис, но элементы рабочего стола удаляются вместо удаления файла из папки c:\program files\pointofsale

и nw i хотите вернуть эти файлы. как их получить?

Грант Уорд, также известный как Бигтедди

Извините, но эта тема закрыта уже больше года. Пожалуйста, начните новую тему с полного вопроса.

Просто будьте осторожны при настройке папки: если cd не сможет изменить патч на %folder%, скрипт аккуратно удалит все содержимое текущей папки.

Объяснение, как я сказал выше: Просто будьте осторожны при настройке папки: если cd не сможет изменить патч на %folder%, сценарий удалит все содержимое текущей папки.

Это не относится к сценарию оболочки (пакетному файлу), который я разместил выше, который, по моему мнению, является более надежным решением.

Спасибо, все работает

Боже, мне нужна суперпомощь, я сделал это, и все было удалено. Я просто хотел удалить внутри пути не весь корневой файл

Неоптимальный способ сделать это.

¿В случае, если существует скрытая папка? ¿Как я могу изменить этот скрипт?

Это решение отлично сработало.

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

Обходной путь заключается в создании папки в том же каталоге, что и пакет, с именем, например, «безопасный», и добавлении этой строки кода в пакет «cd safe» перед всем. Таким образом, он сначала изменит каталог на «безопасную» папку, и если целевая папка недоступна, он только отменит содержимое «безопасной».

У кого-нибудь есть работающий скрипт или что-то простое, что они могут мне дать, чтобы я мог запускать его в запланированном задании, и он мог просто войти в мой корневой каталог и удалить все файлы и папки старше 2 дней?

Ауди911

Угрозы кибербезопасности и потребность в надежном резервном копировании

2022-03-29 18:00:00 UTC Вебинар Вебинар: Spanning — угрозы кибербезопасности и потребность в надежном резервном копировании Сведения о событии Просмотреть все события

11 ответов

Neally

Этот человек является проверенным специалистом

Точно

По какой причине вы не используете powershell?

Neally

Этот человек является проверенным специалистом

Точно

Что-то вроде этого:


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

Ауди911

нет никакой реальной причины, почему я не использую powershell. Я просто всегда делал такие вещи в пакетных файлах.

Я не против PS, мне все равно, какой использовать, главное, чтобы он работал :)

Ауди911

$path = "C:\my folder"
'$path' не распознается как внутренняя или внешняя команда,
рабочая программа или пакетный файл.

$date = (get-date).AddDays(-2)
'$date' не распознается как внутренняя или внешняя команда,
действующая программа или пакетный файл.
неверный синтаксис команды.

Кажется, не работает.

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

По сути, у меня есть такая структура

c:\root folder\subfolder старше 2 дней

c:\корневая папка\подпапка старше 2 дней\содержимое этой папки, которое следует удалить через 2 дня

Руководство хочет знать, можно ли запустить пакетный файл для удаления чего-либо внутри сценария 3 без удаления корневой папки, указанной выше

Neally

Этот человек является проверенным специалистом

Точно

Какую версию PowerShell вы используете? ( $psversiontable)
Что такое ОС?
Похоже, вы пытаетесь запустить powershell в окне cmd?

Этот человек является проверенным специалистом

Мартин9700

Необходимо использовать конвейер:

Гунгнир

Audi911 пишет:

$path = "C:\my folder"
'$path' не распознается как внутренняя или внешняя команда,
рабочая программа или пакетный файл.

Похоже, вы пытаетесь запустить скрипт Нилли из командной строки. Сценарии PowerShell необходимо запускать из консоли PowerShell. Вы можете запустить консоль, выбрав ( Windows 7 )

Пуск > Все программы > Стандартные > Windows PowerShell > Windows PowerShell

или выполнив поиск "PowerShell" в меню "Пуск".

Audi911 написал:

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

По сути, у меня есть такая структура

c:\корневая папка

c:\корневая папка\подпапка старше 2 дней

c:\корневая папка\подпапка старше 2 дней\вложенные в нее папка, которая должна быть удалена через 2 дня

Руководство хочет знать, можно ли запустить пакетный файл для удаления чего-либо внутри сценария 3 без удаления корневой папки выше

Спасибо! )

Что-то вроде этого должно работать:

Оставьте -WhatIf включенным на время тестирования и удалите его, когда убедитесь, что скрипт работает так, как вы хотите. Вам также может понадобиться добавить -Force и/или -Confirm:$false, чтобы все заработало.

Ауди911

Хорошо, я проверю это через некоторое время, я запускаю Powershell из коробки Windows Server 2012 R2

Имя Значение
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.17400
PSCompatibleVersions
PSRemotingProtocolVersion 2.2

Хорошо, чтобы прояснить приведенный ниже сценарий

$Path = 'C:\Root' $DaysOld = 2 Get-ChildItem -Path $Path -Recurse -File | Where-Object < $_.LastWriteTime -lt (Get-Date).AddDays(-$DaysOld) >| Remove-Item -WhatIf

Будет работать, делая то, что я упомянул выше (не удаляя корневые каталоги старше 2 дней, но все внутри них, которым больше 2 дней)

Как только я узнаю, что он работает правильно, я удалю WhatIf и поставлю Remove-Item -Force -Confirm:$false

Гунгнир

Audi911 написал:

Хорошо, чтобы было понятно, приведенный ниже сценарий

$Path = 'C:\Root' $DaysOld = 2 Get- ChildItem -Path $Path -Recurse -File | Where-Object < $_.LastWriteTime -lt ( Get-Date ).AddDays(-$DaysOld) >| Remove-Item -WhatIf

Будет работать, делая то, что я упомянул выше (не удаляя корневые каталоги старше 2 дней, но все внутри них, которым больше 2 дней)

Верно, переключатель -File в Get-ChildItem приводит к тому, что командлет возвращает только файлы, поэтому каталоги не затрагиваются. Оператор Where-Object фильтрует эти результаты таким образом, что в Remove-Item передаются только файлы, в которые не производилась запись за последние два дня.

Audi911 писал(а):

Хорошо, чтобы прояснить приведенный ниже сценарий

$Path = 'C:\Root' $DaysOld = 2 Get- ChildItem -Path $Path -Recurse -File | Where-Object < $_.LastWriteTime -lt (Get-Date).AddDays(-$DaysOld) >| Remove-Item -WhatIf

Будет работать, делая то, что я упомянул выше (не удаляя корневые каталоги старше 2 дней, но все внутри них, которым больше 2 дней)

Как только я узнаю, что он работает правильно, я удалю WhatIf и поставлю Remove-Item -Force -Confirm:$false

Это тоже верно. Эти переключатели могут быть не совсем необходимы для работы скрипта, но он будет работать с этими двумя добавленными.

Кроме того, используйте кнопку вставки кода ( ) при публикации кода в сообществе. Это облегчает чтение ваших сообщений и добавляет подсветку синтаксиса.

Читайте также: