58

我有一个文件夹,我需要删除除一小部分文件和文件夹之外的所有文件和文件夹。

我已经可以排除文件列表,但看不到排除文件夹及其内容的方法。

这是文件夹结构:

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

4

12 回答 12

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

于 2013-02-08T15:36:51.647 回答
31

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

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

除非我缺少某些参数,否则这似乎可以解决问题...

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

于 2013-02-12T00:37:34.283 回答
23

选择除需要保留的内容之外的所有内容并将其传递给删除命令。

假设你有这些文件夹

C:.
├───delme1
│   │   delme.txt
│   │
│   └───delmetoo
├───delme2
├───keepme1
│       keepmetoo.txt
│
└───keepme2

删除所有内容,但保留 keepme1 和 keepme2 文件夹。

Get-ChildItem -Exclude keepme1,keepme2 | Remove-Item -Recurse -Force

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

于 2017-08-21T09:39:20.263 回答
8

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

   Get-ChildItem -Path "PATH_GOES_HERE" -Exclude "Folder1", "Folder2", "READ ME.txt" | foreach ($_) {
       "CLEANING :" + $_.fullname
       Remove-Item $_.fullname -Force -Recurse
       "CLEANED... :" + $_.fullname
   }
于 2015-07-01T07:02:26.443 回答
6

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

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

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

于 2018-11-29T10:20:36.493 回答
5

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

Get-ChildItem * -exclude folderToExclude | Remove-Item
于 2017-06-01T20:16:03.317 回答
4

这也将帮助某人...

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

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

Get-ChildItem -Path $dir2 -Recurse -Exclude "Folder1 ", FileName.txt | foreach ($_) {
$_.fullname >> C:\temp\test.txt
}
于 2015-08-14T02:22:19.353 回答
3

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

@powershell Remove-item C:\Random\Directory\* -exclude "MySpecialFolder", "MySecondSpecialFolder" -force -erroraction 'silentlycontinue'
于 2016-02-24T23:35:32.663 回答
2

我用过这个,非常适合我

Get-ChildItem -Path 'C:\Temp\*' -Recurse | Where-Object {($_.FullName -notlike "*windirstat*") -and ($_.FullName -notlike "C:\Temp\GetFolderSizePortable*")} | Remove-Item -Recurse
于 2016-03-08T20:40:47.870 回答
1

如果您的路径包含正则表达式特殊字符,那么您需要使用不允许管道的 -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 
) 
于 2019-11-06T13:23:30.227 回答
0

这也将帮助某人...

Get-ChildItem -Path PATH_GOES_HERE -Recurse -Exclude "Folder1 ", "Folder2", FileName.txt | foreach ($_) {
    "CLEANING :" + $_.fullname
    Remove-Item $_.fullname -Force -Recurse
    "CLEANED... :" + $_.fullname
}
于 2013-06-03T15:51:10.297 回答
0

我想为这个想法做出贡献

  • 删除所有文件夹和文件包括隐藏文件夹

$get-childitem -Path D:\path\folder\to\delete* -Force |select-object -Expandproperty Fullname |remove-item -recurse -Confirm:$false -Force

  • 删除所有文件夹和文件包括隐藏文件夹但保留排除文件夹

$get-childitem -Path D:\path\folder\to\delete* -排除名称exludefolder -Force | 选择对象-Expandproperty 全名 | 删除项目-强制

$get-childitem -Path D:\path\folder\to\delete\ -排除名称exludefolder -Force | 选择对象-Expandproperty 全名 | 删除项目-强制

第一行保留文件夹,第二行删除剩余文件夹

于 2021-08-20T06:54:03.753 回答