2010-01-05 89 views
11

沒有指定文件,我有一個文件名列表在這樣的文本文件:PowerShell腳本刪除列表中的

f1.txt 
f2 
f3.jpg 

如何刪除一個文件夾中的一切,除了在PowerShell中這些文件?

僞代碼:

  • 閱讀文本文件中的行由行
  • 創建的文件名列表
  • 遞歸文件夾及其子文件夾
  • 如果文件名不是在列表中,刪除它。

回答

15

數據:

-- begin exclusions.txt -- 
a.txt 
b.txt 
c.txt 
-- end -- 

代碼:

# read all exclusions into a string array 
$exclusions = Get-Content .\exclusions.txt 

dir -rec *.* | Where-Object { 
    $exclusions -notcontains $_.name } | ` 
    Remove-Item -WhatIf 

取出-WhatIf開關,如果你滿意你的結果。 -WhatIf顯示你什麼 DO(即它不會刪除)

-Oisin

+3

我喜歡它。但是,爲什麼不使用-notcontains? – 2010-01-06 01:32:38

+0

謝謝。這對我來說非常合適。正如Mike所建議的那樣,我嘗試使用-notcontains,結果是一樣的。 – Mrchief 2010-01-06 16:01:29

+0

我討厭-notcontains。不,只是在開玩笑。是的,這是有史以來。 – x0n 2010-01-07 00:15:42

7

如果在當前文件夾中的文件,那麼你可以這樣做:

Get-ChildItem -exclude (gc exclusions.txt) | Remove-Item -whatif 

這種方法假設每個文件都在一個單獨的行上。如果這些文件存在於子文件夾中,那麼我會採用Oisin的方法。

+0

是的,文件分開。感謝您的答案。 如果父位置具有子文件夾,我得到一個提示說「在該項目Microsoft.PowerShell.Core \ FileSystem的:: <>有孩子和Recurse參數沒有指定是,如果繼續,所有的孩子將與刪除項目,你確定要繼續嗎?「可能添加-recurse開關將修復它。 Oisin的方法不會導致此提示。 – Mrchief 2010-01-06 16:00:05

+3

如果子目錄都參與,那麼你做*不*想用我的方法,你不希望使用-r否則會刪除整個文件夾。 – 2010-01-06 16:22:44

1

其實這似乎只爲第一個目錄的工作,而不是在遞歸 - 我改變劇本遞歸正常。

$exclusions = Get-Content .\exclusions.txt 

dir -rec | where-object {-not($exclusions -contains [io.path]::GetFileName($_))} | ` 
where-object {-not($_ -is [system.IO.directoryInfo])} | remove-item -whatif 
+0

我用$ _。FullName.ToLower()代替[io.path] ::用GetFileName($ _),並在我的排除列表中使用的全路徑名,以獲得遞歸工作。 – toxaq 2011-10-06 09:44:31