Как рекурсивно удалить весь каталог с помощью PowerShell 2.0?
каков самый простой способ принудительно удалить каталог и все его подкаталоги в 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, но примеры обычно удаляют некоторый набор файлов на основе фильтра, а не весь каталог.
Я ищу самый чистый способ выдуть весь каталог, файлы и дочерние каталоги, не создавая никаких предупреждающих сообщений пользователя используя наименьшее количество кода. Однострочный было бы неплохо, если это легко понять.
16 ответов:
Remove-Item -Recurse -Force some_dirдействительно работает как рекламируется здесь.
rm -r -fo some_dir- это сокращенные псевдонимы, которые тоже работают.
насколько я понял,
-Recurseпараметр просто не работает правильно, когда вы пытаетесь удалить отфильтрованный набор файлов рекурсивно. Для убийства одного dir и все ниже, кажется, работает нормально.
при рекурсивном удалении файлов с помощью простого
Remove-Item "folder" -RecurseЯ иногда вижу периодически ошибка :[folder] cannot be removed because it is not empty.этот ответ пытается предотвратить эту ошибку путем индивидуального удаления файлов.
function Get-Tree($Path,$Include='*') { @(Get-Item $Path -Include $Include -Force) + (Get-ChildItem $Path -Recurse -Include $Include -Force) | sort pspath -Descending -unique } function Remove-Tree($Path,$Include='*') { Get-Tree $Path $Include | Remove-Item -force -recurse } Remove-Tree some_dirважной деталью является сортировка всех элементов с
pspath -Descendingтак, что листья удаляются до корней. Сортировка производится наpspathпараметр, так как это имеет больше шансов работать для поставщиков, отличных от файловой системы. Элемент-Includeпараметр - это просто удобство, если вы хотите отфильтровать элементы для удаления.он разделен на две функции, так как я считаю полезным увидеть, что я собираюсь удалить, запустив
Get-Tree some_dir | select fullname
попробуйте этот пример. Если каталог не существует, ошибка не возникает. Возможно, Вам понадобится PowerShell версии 3.0.
remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
чтобы избежать ошибок" каталог не пуст " принятого ответа, просто используйте старую добрую команду DOS, как предлагалось ранее. Полный синтаксис PS, готовый для копирования-вставки:
& cmd.exe /c rd /S /Q $folderToDelete
по какой-то причине ответ Джона риса иногда не работал в моем случае. Но это привело меня в следующем направлении. Сначала я пытаюсь удалить каталог рекурсивно с помощью опции buggy-recurse. Потом я прихожу в каждый подкаталог, что осталось и удалить все файлы.
function Remove-Tree($Path) { Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue if (Test-Path "$Path\" -ErrorAction silentlycontinue) { $folders = Get-ChildItem -Path $Path –Directory -Force ForEach ($folder in $folders) { Remove-Tree $folder.FullName } $files = Get-ChildItem -Path $Path -File -Force ForEach ($file in $files) { Remove-Item $file.FullName -force } if (Test-Path "$Path\" -ErrorAction silentlycontinue) { Remove-Item $Path -force } } }
Я взял другой подход, вдохновленный @john-rees выше-особенно когда его подход начал терпеть неудачу для меня в какой-то момент. В основном рекурсировать поддерево и сортировать файлы по их длине пути-удалить от самого длинного до самого короткого
Get-ChildItem $tfsLocalPath -Recurse | #Find all children Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} | #Calculate the length of their path Sort-Object PathLength -Descending | #sort by path length descending %{ Get-Item -LiteralPath $_.FullName } | Remove-Item -ForceЧто касается магии-LiteralPath, вот еще один gotchya, который может ударить вас:https://superuser.com/q/212808
еще один полезный трюк:
Если вы найдете много файлов с одинаковыми или похожими именами (например, mac-файл с именем префикса точки... этот знаменитый файл pulltion), вы можете легко удалить их с помощью одной строки из powershell следующим образом:
ls -r .* | rmв этой строке будут удалены все файлы с точкой в начале имени внутри текущего каталога,а также все файлы с одинаковыми обстоятельствами внутри других папок внутри этого каталога. Будьте в курсе об этом при его использовании. : D
удаление всего дерева папок иногда работает, а иногда терпит неудачу с ошибками "Каталог не пуст". Впоследствии попытка проверить, существует ли папка, может привести к ошибкам" отказано в доступе "или" несанкционированный доступ". Я не знаю, почему это происходит, хотя некоторое понимание может быть получено от это сообщение StackOverflow.
я смог обойти эти проблемы, указав порядок, в котором элементы в папке удаляются, и добавив перебои. Следующее работает хорошо для меня:
# First remove any files in the folder tree Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force # Then remove any sub-folders (deepest ones first). The -Recurse switch may be needed despite the deepest items being deleted first. ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force } # Then remove the folder itself. The -Recurse switch is sometimes needed despite the previous statements. Remove-Item -LiteralPath $FolderToDelete -Recurse -Force # Finally, give Windows some time to finish deleting the folder (try not to hurl) Start-Sleep -Seconds 4статья Microsoft TechNet Использование Вычисляемых Свойств в PowerShell мне было полезно получить список подпапок, отсортированных по глубине.
аналогичные проблемы надежности с RD /S / Q может быть решена путем запуска RD /S / Q дважды - в идеале с паузой между ними (т. е. с помощью пинг как показано ниже).
RD /S /Q "C:\Some\Folder\to\Delete" > nul if exist "C:\Some\Folder\to\Delete" ping -4 -n 4 127.0.0.1 > nul if exist "C:\Some\Folder\to\Delete" RD /S /Q "C:\Some\Folder\to\Delete" > nul
удалить все содержимое, включая структуру папок использовать
get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}The
-recurseдобавилremove-itemгарантирует, что интерактивные подсказки отключены.
использование PowerShell commnads для удаления всех файлов и папок
Remove-Item-Path "C:\dotnet-helpers*.* "- recurse
Recurse сверлит и находит намного больше файлов. На –параметр recurse позволит PowerShell удалять любые дочерние элементы без запроса разрешения.Кроме того, параметр-force можно добавить для удаления скрытых или доступных только для чтения файлов.
используя -Force command мы можем удалить файлы сила полностью
использование PowerShell commnads для полного удаления всех файлов
Remove-Item-Path "C:\dotnet-helpers*.* "- Сила
с примером: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/
del <dir> -Recurse -Force # I prefer this, short & sweetили
remove-item <dir> -Recurse -ForceЕсли у вас есть огромный каталог то, что я обычно делаю это
while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}запустите это на другом терминале powershell, и он остановится, когда это будет сделано.
$users = get-childitem \ServerName\c$\users\ | select -ExpandProperty name foreach ($user in $users) { remove-item -path "\Servername\c$\Users$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse Write-Warning "$user Cleaned" }написал выше, чтобы очистить некоторые файлы журналов без удаления родительского каталога, и это работает отлично!
Comments