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

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

问题描述:

我有一个需要删除除文件和文件夹的小列表以外的所有文件和文件夹的应用程序。删除所有文件和文件夹,但排除目录

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

这里的文件夹结构:

|-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及其内容?

+0

我在这里失踪了什么?这似乎为我工作'Get-ChildItem -Path'C:\ temp'-Recurse -exclude somefile.txt,foldertokeep |删除项目的力量 - 推倒' – KCD 2016-09-01 22:10:34

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

的-recurse开关不上删除,项目正常工作(它会试图删除文件夹,该文件夹中的所有子项已被删除之前)。按长度降序排列全名,可确保删除文件夹中的所有子项之前未删除任何文件夹。

+2

复杂和辉煌和典型的粗糙度的Powershell。我希望它不断发展。谢谢。 – moodboom 2014-08-27 14:17:53

+1

我不得不在最后一行添加一个额外的[-Recurse]参数,让脚本无需提示即可继续。 – moodboom 2014-08-27 14:57:53

+0

什么是“排序长度 - 升序”在做什么? – KyleMit 2015-08-11 18:10:08

在PowerShell中3.0和下面,你可以尝试简单地这样做:

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

除非有一些参数,我的思念,这似乎是在做的伎俩......

编辑:见下面的评论,在PS3之后Remove-Item的行为已经改变,这个解决方案似乎不再适用。

+15

我在PowerShell 3.0中这样做,它工作得很好。但是,我只注意到在PowerShell 4.0中更改了行为。例如,假设你在同一个父目录下有目录“a”和“b”,目录“a”下有文件“c.txt”。如果从父目录运行“rm。\\ * -Recurse -Exclude a”。在PS 4中,c.txt将被删除。在PS 3中它不会。我想知道这是否是在PS 4中的错误,因为它没有意义恕我直言。 – 2013-12-17 22:11:34

+2

@JonMiller同样的问题在这里。从PS2迁移到PS4注意到一些重要的目录已从我们的系统中删除。好的备份。 :) – 2014-07-23 05:17:28

+0

在评论中很棒的信息。所以,根据PowerShell版本的不同,这可能不是一种安全的技术来使用不同的可能行为? – JohnB 2016-04-27 14:56:43

这也将帮助别人......

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

我用下面的,只是从第一线-Recurse删除,离开排除文件夹列表下的所有文件和子文件夹。

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

这也将帮助别人......

增加对PATH_GOES_HERE是空的或事先没有定义会导致在用户目录递归删除(或C变量:\ Windows \ System32下如果脚本以admin身份运行)。我发现这很困难,不得不重新安装Windows。

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

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

我碰到了这个,发现一行命令对我有用。它将删除目录中的所有文件夹和文件,同时保留“排除”列表上的任何内容。它也是无声的,所以如果某些文件是只读或正在使用的,它不会返回错误。

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

我用这个,完美的作品对我来说

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

根据MSDNRemove-Item已与-exclude PARAM一个已知的问题。改用这个变体。

Get-ChildItem * -exclude folderToExclude | Remove-Item 

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

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

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