我尝试将以下代码作为 powershell 脚本运行,但无法使其工作。首先,以下内容适用于一个-Include
项目,但我似乎无法使其适用于多个项目。第二,-Exclude
周界似乎不起作用。我仍然从计算机目录:\Windows和目录:目 录 。
$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
}