Удалить все файлы и папки, но исключить подпапку
У меня есть папка, в которой мне нужно удалить все файлы и папки, кроме небольшого списка файлов и папок.
Я уже могу исключить список файлов, но не вижу способа исключить папку и ее содержимое.
Вот структура папок:
|-C:\temp
\-C:\temp\somefile.txt
\-C:\temp\someotherfile.txt
| |-C:\temp\foldertodelete
\-C:\temp\foldertodelete\file1.txt
| |-C:\temp\foldertokeep
| \-C:\temp\foldertokeep\file2.txt
Я хочу сохранить somefile.txt и папку с ключами и ее содержимым.
Это то, что у меня сейчас есть:
Get-ChildItem -Path 'C:\temp' -Recurse -exclude somefile.txt | Remove-Item -force -recurse
Это действительно не удаляет somefile.txt. Есть ли способ исключить сохранение папки folder и ее содержимого из списка удаления?
Ответы
Ответ 1
Get-ChildItem -Path 'C:\temp' -Recurse -exclude somefile.txt |
Select -ExpandProperty FullName |
Where {$_ -notlike 'C:\temp\foldertokeep*'} |
sort length -Descending |
Remove-Item -force
Переключатель -recurse не работает должным образом в Remove-Item (он попытается удалить папки, прежде чем все дочерние элементы в папке будут удалены). Сортировка полных имен в порядке убывания по длине за исключением случаев, когда никакая папка не удаляется, прежде чем все дочерние элементы в папке будут удалены.
Ответ 2
В PowerShell 3.0 и ниже вы можете просто попробовать:
Remove-Item -recurse c:\temp\* -exclude somefile.txt,foldertokeep
Если нет какого-то параметра, который мне не хватает, это, кажется, делает трюк...
Изменить: см. комментарии ниже, поведение Remove-Item изменилось после PS3, это решение больше не подходит.
Ответ 3
Я использую этот подход, предполагая, что вы хотите исключить некоторые файлы или папки на корневом уровне, но затем вы хотите удалить все внутри них.
C:.
├───delme1
│ │ delme.txt
│ │
│ └───delmetoo
├───delme2
├───folder1
│ keepmesafe.txt
│
└───folder2
Итак, вы хотите удалить все и сохранить папку folder1 и folder2
Get-ChildItem -Exclude folder1,folder2 | Remove-Item -Recurse -Force
Есть много других решений, но я нашел это легко понять и запомнить.
Ответ 4
Я использовал ниже и только что удалил -Recurse из первой строки, и он оставляет все файлы и подпапки в списке исключаемых папок.
Get-ChildItem -Path "PATH_GOES_HERE" -Exclude "Folder1", "Folder2", "READ ME.txt" | foreach ($_) {
"CLEANING :" + $_.fullname
Remove-Item $_.fullname -Force -Recurse
"CLEANED... :" + $_.fullname
}
Ответ 5
Я столкнулся с этим и нашел одну строку, которая работает для меня. Он удалит все папки и файлы в соответствующем каталоге, сохранив что-либо в списке "исключенных". Он также не работает, поэтому он не будет возвращать ошибку, если некоторые файлы доступны только для чтения или используются.
@powershell Remove-item C:\Random\Directory\* -exclude "MySpecialFolder", "MySecondSpecialFolder" -force -erroraction 'silentlycontinue'
Ответ 6
Согласно MSDN Remove-Item
имеет известную проблему с параметром -exclude
. Вместо этого используйте этот вариант.
Get-ChildItem * -exclude folderToExclude | Remove-Item
Ответ 7
Это также поможет кому-то...
Добавление переменной для PATH_GOES_HERE, которая является пустой или не определена ранее, может привести к рекурсивному удалению в каталоге пользователя (или C:\windows\system32, если script запущен как admin). Я нашел это трудным путем и должен был переустановить окна.
Попробуйте сами! (ниже будут выводиться только файлы в файл test.txt)
Get-ChildItem -Path $dir2 -Recurse -Exclude "Folder1 ", FileName.txt | foreach ($_) {
$_.fullname >> C:\temp\test.txt
}
Ответ 8
Я использовал это, что отлично работает для меня
Get-ChildItem -Path 'C:\Temp\*' -Recurse | Where-Object {($_.FullName -notlike "*windirstat*") -and ($_.FullName -notlike "C:\Temp\GetFolderSizePortable*")} | Remove-Item -Recurse
Ответ 9
Да, я знаю, что это старая тема. Я не смог заставить ни один из приведенных выше ответов работать в Powershell 5, поэтому вот что я понял:
Get-ChildItem -Path $dir -Exclude 'name_to_ignore' |
ForEach-Object {Remove-Item $_ -Recurse }
Это перемещает -Recurse в Remove-Item вместо того, где они находятся.
Ответ 10
Это также поможет кому-то...
Get-ChildItem -Path PATH_GOES_HERE -Recurse -Exclude "Folder1 ", "Folder2", FileName.txt | foreach ($_) {
"CLEANING :" + $_.fullname
Remove-Item $_.fullname -Force -Recurse
"CLEANED... :" + $_.fullname
}