Какой самый простой способ принудительно удалить каталог и все его подкаталоги в PowerShell? Я использую PowerShell V2 в Windows 7.
Из нескольких источников я узнал, что наиболее очевидная команда Remove-Item $targetDir -Recurse -Force
, работает неправильно. Это включает в себя интерактивную справку PowerShell V2 (найденную с использованием Get-Help Remove-Item -Examples
), в которой говорится:
... Поскольку параметр Recurse в этом командлете неисправен, команда использует командлет Get-Childitem для получения нужных файлов и использует оператор конвейера для передачи их в командлет Remove-Item ...
Я видел различные примеры, которые используют Get-ChildItem и передают его в Remove-Item , но примеры обычно удаляют некоторый набор файлов на основе фильтра, а не весь каталог.
Я ищу самый чистый способ уничтожить весь каталог, файлы и дочерние каталоги, не генерируя никаких пользовательских предупреждений с использованием наименьшего количества кода. Однострочно было бы хорошо, если бы это было легко понять.
источник
RD /S /Q
rd
это псевдоним дляRemove-Item
PowerShell.cmd /c "rd /s /q"
работает, хотя.Ответы:
действительно работает как рекламируется здесь.
сокращенные псевдонимы, которые тоже работают.
Насколько я понял,
-Recurse
параметр просто не работает правильно, когда вы пытаетесь рекурсивно удалить отфильтрованный набор файлов. Для убийства одного dir и всего, что ниже, кажется, работает нормально.источник
cmd /c rd
как указано ниже.Я использовал:
Это работает для меня как шарм (я украл его из Ubuntu).
источник
rm
это псевдоним дляRemove-Item
конфигурации по умолчанию в PowerShell. Проверьте выводGet-Alias rm
для более подробной информации. Использует-r
преимущества частичного соответствия PowerShell для параметров. Так какRemove-Item
имеет только один параметр, который начинается с 'r'-Recurse
,-r
соответствует этому. Таким образом, следующий все будет работать так же:rm -r
,rm -re
,Remove-Item -Recurse
. (Обратите внимание , что ни один,rm -rf
ниrm -r -f
не будет работать, ноrm -r -fo
. Будет-rf
не соответствует никаких параметров и-f
соответствует более чем одному.)rm -rf folder
и, конечно, это не удалось. Я изначально вниз проголосовал за ответ (потому что это сказал Ubuntu). Благодаря комментарию @chwarr, я попробовал его без,f
и он взял псевдоним, а не бинарный файл rm. Я хотел бы, чтобы Туан обновил свой источник (не уверен, знал ли Туан, что это псевдоним, или действительно думал, что это был Unix rm ;-)-R
вместо-r
(хотя, насколько я знаю, PowerShell похож на остальные Windows, не чувствительны к регистру, следовательно, это не должно иметь никакого значения), но я получил ошибку, что папки, которые я пытаюсь удалить, не пустой.При рекурсивном удалении файлов с использованием простого файла
Remove-Item "folder" -Recurse
я иногда вижу прерывистую ошибку:[folder] cannot be removed because it is not empty.
Этот ответ пытается предотвратить эту ошибку путем индивидуального удаления файлов.
Важной деталью является сортировка всех элементов
pspath -Descending
так, чтобы листья удалялись перед корнями. Сортировка выполняется поpspath
параметру, поскольку у него больше шансов работать для поставщиков, отличных от файловой системы.-Include
Параметр только для удобства , если вы хотите , чтобы отфильтровать элементы для удаления.Он разделен на две функции, так как мне полезно посмотреть, что я собираюсь удалить, запустив
источник
remove-item -recurse
в Powershell v5, так что это решение лучше для меня.... работал на меня
источник
Попробуйте этот пример. Если каталог не существует, ошибка не возникает. Вам может понадобиться PowerShell v3.0.
источник
Используйте команду старой школы DOS:
источник
/q
(Тихий режим, не спрашивайте, можно ли удалить дерево каталогов с помощью / S).Почему-то ответ Джона Риса иногда не работал в моем случае. Но это привело меня в следующем направлении. Сначала я пытаюсь рекурсивно удалить каталог с ошибкой -recurse. После этого я спускаюсь в каждый оставленный подкаталог и удаляю все файлы.
источник
Чтобы избежать ошибок «Каталог не пуст» принятого ответа, просто используйте старую добрую команду DOS, как предлагалось ранее. Полный синтаксис PS, готовый для вставки копии:
источник
Я выбрал другой подход, вдохновленный @ john-rees выше - особенно, когда его подход начал терпеть неудачу для меня в какой-то момент. В основном, рекурсивно проверяйте поддерево и сортируйте файлы по их длине пути - удаляйте от самых длинных до самых коротких
Что касается магии -LiteralPath, вот еще одна ошибка, которая может ударить вас: https://superuser.com/q/212808
источник
ИЛИ
Если у вас огромный каталог, то я обычно делаю
Запустите это на другом терминале powershell, и он остановится, когда это будет сделано.
источник
Удаление всего дерева папок иногда работает, а иногда приводит к ошибкам «Directory not empty». Впоследствии попытка проверить, существует ли папка, может привести к ошибкам «Доступ запрещен» или «Несанкционированный доступ». Я не знаю, почему это происходит, хотя некоторая информация может быть получена из этой публикации StackOverflow .
Мне удалось обойти эти проблемы, указав порядок, в котором элементы в папке удаляются, и добавив задержки. Следующее работает хорошо для меня:
Статья Microsoft TechNet « Использование вычисляемых свойств в PowerShell» помогла мне получить список подпапок, отсортированных по глубине.
Подобные проблемы с надежностью в RD / S / Q могут быть решены путем запуска DEL / F / S / Q до RD / S / Q и запуска RD во второй раз, если необходимо - в идеале с паузой между ними (т. Е. С помощью ping, как показано ниже).
источник
Действительно просто:
источник
Еще один полезный трюк:
Если вы найдете множество файлов с одинаковыми или похожими именами (например, mac-файл с префиксным именем точки ... с этим известным извлечением файла), вы можете легко удалить их одной строкой из powershell, например так:
Эта строка удалит все файлы с точкой в начале имени внутри текущего каталога, а также все файлы с такими же обстоятельствами в других папках внутри этого каталога. Помните об этом при использовании. : D
источник
rm -rf .*
? У меня нет PowerShell для тестирования, но я думаю, что это сработает.Для удаления всего содержимого, включая структуру папок, используйте
-recurse
Добавлен вremove-item
обеспечивает проведение отключены интерактивные подсказки.источник
Написал выше, чтобы очистить некоторые файлы журналов, не удаляя родительский каталог, и это работает отлично!
источник
источник