我正在运行的 PowerShell 脚本的一部分,我希望它完全忽略特定的文件夹或路径。
我尝试使用-notmatch
and-notlike
运算符。但似乎它仍会遍历该文件夹中的每个文件。虽然它不会处理该文件夹中的项目,因此我得到了所需的结果,但该文件夹中仍有数十万个文件,并且仅运行脚本就需要很长时间。我只是希望它完全绕过该文件夹。
以下是我所拥有的脚本的一部分:
$allfiles = Get-ChildItem -path $BaseDirectory -Force -File -Recurse | ? { $_.FullName -notmatch 'DATA\SHARED\GAMES\STEAM\SteamLibrary' } | select-object Name,FullName,Length
我也尝试过:
Where { $_.FullName -notlike '*\DATA\SHARED\GAMES\STEAM\SteamLibrary\*' }
有没有更好的方法让它完全跳过该文件夹,最好使用相对路径?或者甚至只是文件夹名称SteamLibrary
谢谢!
答案1
获取除 SteamLibrary 之外的所有目录 &然后获取每个文件:
$allfiles = Get-ChildItem $BaseDirectory -Dir -Force -Recurse |
? Name -notLike 'SteamLibrary' |
Get-ChildItem -File -Force |
select-object Name,FullName,Length
排除多个项目的选项
如果我们想要排除多个文件夹,我们可以使用:
gci -dir -recurse |
? ( Name -notLike 'SteamLibrary' ) -and ( Name -notLike 'PCBACKUP' ) | ...
但只有两个值,这已经很麻烦了。运算符使用正则表达式而-match/notMatch
不是简单的通配符,因此要排除多个值,我们可以使用正则表达式运算符or
::|
gci -dir -recurse |
? ( Name -notMatch 'SteamLibrary|PCBACKUP' ) | ...
并且可以将其扩展到 3、4 或 5 个值并且仍然易于管理。此外,可以在代码中较早的变量中定义比较字符串:
$Exclude = 'Iowa|Maine|Ohio|Utah'
gci -dir -recurse |
? ( Name -notMatch $Exclude ) | ...
对于较大的排除值集合,最好的方法可能是将排除值放在字符串数组中并使用-notIn
运算符:
$Exclude = @'
Iowa
Maine
Ohio
Utah
Illinois
Indiana
Missouri
Mississippi
'@ -split "`n"
gci -dir -recurse |
? ( Name -notMatch $Exclude ) | ...