我有一個PowerShell 2.0腳本,我用它來刪除其中沒有任何文件的文件夾:PowerShell的:找到並刪除那些在他們或在孩子沒有文件夾文件夾
dir 'P:\path\to\wherever' -recurse | Where-Object { $_.PSIsContainer } | Where-Object { $_.GetFiles().Count -eq 0 } | foreach-object { remove-item $_.fullname -recurse}
然而,我注意到,運行腳本時出現了很多錯誤。即:
Remove-Item : Directory P:\path\to\wherever cannot be removed because it is not empty.
「什麼?!」我驚慌失措。他們應該全部是空的!我只篩選空文件夾!顯然,這不是腳本的工作方式。在這種情況下只具有文件夾作爲孩子,但文件作爲孫子的文件視爲空文件夾:
Folder1 (no files - 1 folder) \ Folder 2 (one file)
在這種情況下,PowerShell中看到Folder1中爲空,並試圖將其刪除。這使我感到困惑的原因是,如果我在Windows資源管理器中右鍵單擊Folder1它說Folder1中有1個文件夾和1個文件。無論用於從資源管理器中計算Folder1下面的子對象,都可以看到孫子對象無限。
問:
我怎樣才能讓我的腳本沒有考慮的一個文件夾爲空,如果有文件,孫子或超越?
啊哈!這就說得通了。但是,我必須反覆運行腳本才能真正清除所有容器,意味着第一次運行會獲得樹上最遠的葉子。然後第二個會得到自上次腳本運行以來現在爲空的下一個集合。等等。那麼,我是不是要循環腳本直到沒有輸出,或者有沒有更好的方法來做到這一點?你願意把它作爲一個完全獨立的問題嗎? – Wesley
@wesley - 你可以使用遞歸函數。檢查我的答案。 – JNK
@WesleyDavid - 您可以嵌套管道。看到我更新的答案和鏈接的答案。 – manojlds