举一个简单的例子,假设我有一个文件夹Root
,里面有三个文件夹; Folder1,Folder2和Folder3。每个文件夹(包括Root
)都包含一堆文件,包括.pdb文件。我想使用PowerShell Get-ChildItem cmdlet返回所有文件夹中的所有文件(包括Root
),但Folder2中的.pdb文件除外。如果我使用:
Get-ChildItem -Path C:\Root -Recurse -Exclude *.pdb
然后我回到所有目录中的所有非.pdb文件,这接近我想要的。所以我假设以下内容可以实现我的目标:
Get-ChildItem -Path C:\Root -Recurse -Exclude \*\\Folder2\\*.pdb
但这并不排除Folder2(或任何其他文件夹)中的任何pdb文件。我为-Exclude
过滤器尝试了几种变体,例如Folder2\\\*.pdb
,但我无法让它工作。事实上,即使使用\*\\\*.pdb
似乎也没有做任何事情;没有.pdb文件从任何文件夹中排除。
所以似乎通配符不能用于目录,只能用于文件名,但我认为我只是做错了。我找到了this article explaining the wildcard and range operators,但不幸的是,它没有讨论将它们与目录名称一起使用;只有文件名。
答案 0 :(得分:7)
我还没有看到使用目录的exclude参数。
您可以尝试使用Where-Object。也就是说,
Get-ChildItem -Recurse *.pdb | Where-Object {$_.FullName -notMatch "folder2"}
答案 1 :(得分:3)
OhadH的回答几乎就在那里。
您可以使用
Get-ChildItem -Recurse | Where-Object {$_.FullName -notmatch "folder2" -or $_.Name -notlike "*.pdb" }
或
Get-ChildItem -Recurse | ? {$_.FullName -notlike "*folder2*" -or $_.Name -notlike "*.pdb" }
这取决于您的folder2所在的位置。但我认为你有这个主意。
我讨厌说出来,但PowerShell并不像Bash或其他shell那样方便。
答案 2 :(得分:3)
gci "C:\Root" -Recurse | Where-Object {$_.FullName -notlike "*Folder2\*.pdb*"} | Export-CSV "C:\Root\Export.csv" -NoType
试过,测试过&一个班轮:-)。这是因为我复制了你的文件夹&要复制的文件结构。很抱歉,它迟到了几年。
显然,请随意调整代码以满足您的需求。
答案 3 :(得分:-1)
这应该适合你:
Get-ChildItem -Path C:\Root -Exclude "*\Folder2\*.pdb" -Recurse