2013-02-08 282 views
28

我有一個需要刪除除文件和文件夾的小列表以外的所有文件和文件夾的應用程序。刪除所有文件和文件夾,但排除目錄

我已經可以排除文件列表,但沒有看到排除文件夾的方法。

這裏的文件夾結構:

|-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

回答

35
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

20

在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

0

這也將幫助別人......

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

我用下面的,只是從第一線-Recurse刪除,離開排除文件夾列表下的所有文件和子文件夾。

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

這也將幫助別人......

增加對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 
} 
1

我碰到了這個,發現一行命令對我有用。它將刪除目錄中的所有文件夾和文件,同時保留「排除」列表上的任何內容。它也是無聲的,所以如果某些文件是隻讀或正在使用的,它不會返回錯誤。

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

我用這個,完美的作品對我來說

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

根據MSDNRemove-Item已與-exclude PARAM一個已知的問題。改用這個變體。

Get-ChildItem * -exclude folderToExclude | Remove-Item 
1

我使用這種方法,假設您想要在根級別排除某些文件或文件夾,但您希望刪除它們中的所有內容。

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

還有很多其他的解決方案,但我發現這很容易理解和記住。

相關問題