Подтвердить что ты не робот

Удалить все файлы и папки, но исключить подпапку

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

Я уже могу исключить список файлов, но не вижу способа исключить папку и ее содержимое.

Вот структура папок:

|-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 и ее содержимого из списка удаления?

4b9b3361

Ответ 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
}