删除所有文件和文件夹但排除目录

Mat*_*s F 44 powershell

我有一个需要删除所有文件和文件夹的文件,除了一小部分文件和文件夹.

我已经可以排除文件列表,但是没有找到排除文件夹的方法.

这是文件夹结构:

|-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
Run Code Online (Sandbox Code Playgroud)

我想保留somefile.txt和文件夹foldertokeep及其内容.

这就是我现在所拥有的:

Get-ChildItem -Path  'C:\temp' -Recurse -exclude somefile.txt | Remove-Item -force -recurse
Run Code Online (Sandbox Code Playgroud)

这真的不删除somefile.txt.有没有办法从删除列表中排除文件夹foldertokeep及其内容?

mjo*_*nor 50

Get-ChildItem -Path  'C:\temp' -Recurse -exclude somefile.txt |
Select -ExpandProperty FullName |
Where {$_ -notlike 'C:\temp\foldertokeep*'} |
sort length -Descending |
Remove-Item -force 
Run Code Online (Sandbox Code Playgroud)

-recurse开关在Remove-Item上无法正常工作(它将尝试在删除文件夹中的所有子项之前删除文件夹).按长度降序对全名进行排序可确保在删除文件夹中的所有子项之前没有删除任何文件夹.

  • Powershell的粗糙度复杂而精彩且典型.我希望它不断发展.谢谢. (2认同)

Poo*_*nny 26

在PowerShell 3.0及更低版本中,您可以尝试简单地执行此操作:

Remove-Item -recurse c:\temp\* -exclude somefile.txt,foldertokeep
Run Code Online (Sandbox Code Playgroud)

除非我缺少一些参数,否则这似乎就是诀窍......

编辑:看下面的评论,删除项目的行为在PS3之后发生了变化,此解决方案似乎不再适用.

  • 我在PowerShell 3.0中这样做,它工作得很好.但是,我刚刚注意到PowerShell 4.0中的行为发生了变化.例如,假设您在同一个父目录中有目录"a"和"b",并且在目录"a"下有文件"c.txt".如果从父目录运行"rm.\\*-Recurse -Exclude a".在PS 4中,c.txt将被删除.在PS 3中它不会.我想知道这是否是PS 4中的一个错误,因为它没有意义恕我直言. (15认同)
  • 大声笑.它尊重了排除文件夹,但不是它的内容 (6认同)
  • @JonMiller这里也有同样的问题.从PS2迁移到PS4注意到我们的一个系统擦除了一些重要的目录.备份的好处.:) (3认同)

gui*_*lem 14

我使用这种方法,假设您想在根级别上排除某些文件或文件夹,但随后又要删除其中的所有内容。

C:.
????delme1
?   ?   delme.txt
?   ?
?   ????delmetoo
????delme2
????folder1
?       keepmesafe.txt
?
????folder2
Run Code Online (Sandbox Code Playgroud)

因此,您要删除所有内容并保留folder1和folder2

Get-ChildItem -Exclude folder1,folder2 | Remove-Item -Recurse -Force
Run Code Online (Sandbox Code Playgroud)

还有许多其他解决方案,但是我发现这很容易理解和记住。


Dav*_*e D 8

我使用了下面的内容,刚从第一行中删除-Recurse,它将所有文件和子文件夹保留在排除文件夹列表下.

   Get-ChildItem -Path "PATH_GOES_HERE" -Exclude "Folder1", "Folder2", "READ ME.txt" | foreach ($_) {
       "CLEANING :" + $_.fullname
       Remove-Item $_.fullname -Force -Recurse
       "CLEANED... :" + $_.fullname
   }
Run Code Online (Sandbox Code Playgroud)


Paw*_*sen 6

是的,我知道这是一个旧线程。我无法在 Powershell 5 中获得上述任何答案,所以这是我的想法:

Get-ChildItem -Path $dir -Exclude 'name_to_ignore' |
ForEach-Object {Remove-Item $_ -Recurse }
Run Code Online (Sandbox Code Playgroud)

这会将 -Recurse 移动到 Remove-Item 而不是找到项目的位置。


And*_*ung 5

根据MSDN Remove-Item-exclude参数存在一个已知问题。请改用此变体。

Get-ChildItem * -exclude folderToExclude | Remove-Item
Run Code Online (Sandbox Code Playgroud)