Powershell 使用 Get-ChildItem 跳过文件夹

Powershell 使用 Get-ChildItem 跳过文件夹

我正在运行的 PowerShell 脚本的一部分,我希望它完全忽略特定的文件夹或路径。

我尝试使用-notmatchand-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 ) | ...

相关内容