Powershell Get-ChildItem Include\Exclude - 簡單腳本無法正常運作

Powershell Get-ChildItem Include\Exclude - 簡單腳本無法正常運作

我嘗試將以下程式碼作為 powershell 腳本運行,但我無法讓它工作。第一,以下內容適用於一個-Include項目,但我似乎無法讓它適用於多個項目。第二,-Exclude週邊似乎無法運作。我仍然從以下位置獲取文件C:\WindowsC:\程式文件目錄。

$Include = "*.zip","*.rar","*.tar","*.7zip"
$exclude = "C:\Windows","C:\Program Files"
Get-ChildItem "C:\" -Include $Include -Exclude $Exclude -Recurse -Force -ErrorAction silentlycontinue | Select-Object -ExpandProperty FullName

注意:此腳本的目的是尋找系統上的所有壓縮檔案。我知道這可能非常簡單,但我似乎無法讓它發揮作用。

答案1

-Exclude參數從未真正正常工作過。它似乎與Name屬性匹配,這通常不是很有用。您可能只需要自己進行過濾:

$Include = "*.zip","*.rar","*.tar","*.7zip"
Get-ChildItem "C:\" -Include $Include -Recurse -Force -ErrorAction silentlycontinue | 
    ? { $_.FullName -notmatch "^C:\\Windows" -and $_.FullName -notmatch "^C:\\Program" } |
    Select-Object -ExpandProperty FullName

(順便說一句,-Filter比 快得多-Include。缺點是你不能像使用 一樣給它一組模式-Include。但即使你必須搜索四次,它仍然可能更快。我不能肯定地說,如果速度對您來說很重要,那麼可能值得測試。

答案2

我同意 dangph 的觀點,即 -exclude 不能按預期工作。
使用 -notmatch 時,您可以使用 或 建立正規表示式模式|
這適用於修改後的 $include:

$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'
Get-ChildItem "C:\" -Include $Include -Recurse -Force -EA 0| 
  Where FullName -notmatch $exclude|
  Select-Object -ExpandProperty FullName

編輯由於排除的資料夾是第一級,因此根本不迭代它們要快得多,因此兩步方法更有效:

$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'

Get-ChildItem "C:\" -Directory |
  Where FullName -notmatch $exclude|ForEach {
  Get-ChildItem -Path $_.FullName -Include $Include -Recurse -Force -EA 0| 
  Select-Object -ExpandProperty FullName
}

相關內容