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

时间:2013-02-08 15:18:06

标签: 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

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

这就是我现在所拥有的:

Get-ChildItem -Path  'C:\temp' -Recurse -exclude somefile.txt | Remove-Item -force -recurse

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

11 个答案:

答案 0 :(得分:49)

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上无法正常工作(它会在删除文件夹中的所有子项之前尝试删除文件夹)。按长度降序对全名进行排序可确保在删除文件夹中的所有子项之前没有删除任何文件夹。

答案 1 :(得分:25)

在PowerShell 3.0和下面中,您可以尝试简单地执行此操作:

Remove-Item -recurse c:\temp\* -exclude somefile.txt,foldertokeep

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

编辑:请参阅下面的评论,在PS3之后删除项目的行为已经改变,此解决方案似乎不再适用。

答案 2 :(得分:7)

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

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

答案 3 :(得分:7)

我使用这种方法假设你想要在根级别排除某些文件或文件夹,但是你想要删除它们内部的所有内容。

C:.
├───delme1
│   │   delme.txt
│   │
│   └───delmetoo
├───delme2
├───folder1
│       keepmesafe.txt
│
└───folder2

所以你想删除所有内容并保留folder1和folder2

Get-ChildItem -Exclude folder1,folder2 | Remove-Item -Recurse -Force

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

答案 4 :(得分:3)

我遇到了这个,发现了一个适用于我的一行命令。它将删除相关目录中的所有文件夹和文件,同时保留“排除”列表中的任何内容。它也是静默的,因此如果某些文件是只读或正在使用的话,它不会返回错误。

@powershell Remove-item C:\Random\Directory\* -exclude "MySpecialFolder", "MySecondSpecialFolder" -force -erroraction 'silentlycontinue'

答案 5 :(得分:2)

这也有助于某人...

为PATH_GOES_HERE添加一个空的或之前未定义的变量可能会导致用户目录中的递归删除(如果脚本以管理员身份运行,则会导致C:\ windows \ system32)。我发现这很困难,不得不重新安装Windows。

亲自试试吧! (下面只会将文件目录输出到test.txt中)

Get-ChildItem -Path $dir2 -Recurse -Exclude "Folder1 ", FileName.txt | foreach ($_) {
$_.fullname >> C:\temp\test.txt
}

答案 6 :(得分:2)

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

Get-ChildItem * -exclude folderToExclude | Remove-Item

答案 7 :(得分:1)

我用过这个,对我来说很完美

Get-ChildItem -Path 'C:\Temp\*' -Recurse | Where-Object {($_.FullName -notlike "*windirstat*") -and ($_.FullName -notlike "C:\Temp\GetFolderSizePortable*")} | Remove-Item -Recurse

答案 8 :(得分:1)

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

Get-ChildItem -Path $dir -Exclude 'name_to_ignore' |
ForEach-Object {Remove-Item $_ -Recurse }

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

答案 9 :(得分:0)

这也有助于某人...

Get-ChildItem -Path PATH_GOES_HERE -Recurse -Exclude "Folder1 ", "Folder2", FileName.txt | foreach ($_) {
    "CLEANING :" + $_.fullname
    Remove-Item $_.fullname -Force -Recurse
    "CLEANED... :" + $_.fullname
}

答案 10 :(得分:0)

如果路径中包含正则表达式特殊字符,则需要使用-LiteralPath选项,该选项不允许使用管道。在这种情况下,正确的解决方案如下所示:

    Remove-Item -force -LiteralPath(    
    Get-ChildItem -Path  'C:\temp' -Recurse -exclude somefile.txt |
    Select-Object -ExpandProperty FullName |
    Where-Object { $_ -notlike 'C:\temp\foldertokeep*' } |
    Sort-Object length -Descending 
)