13

举个简单的例子,假设我有一个文件夹,Root,其中包含三个文件夹;文件夹 1、文件夹 2 和文件夹 3。这些文件夹中的每一个(包括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 文件从任何文件夹中排除。

所以似乎通配符不能用于目录,只能用于文件名,但我认为我只是做错了什么。我发现这篇文章解释了通配符和范围运算符,但不幸的是它没有讨论将它们与目录名称一起使用;只有文件名。

4

5 回答 5

11

我也没有看到 exclude 参数与目录一起使用。

您可以尝试将管道连接到Where-Object。那是,

Get-ChildItem -Recurse *.pdb | Where-Object {$_.FullName -notMatch "folder2"}
于 2013-01-23T01:16:28.403 回答
5
 gci "C:\Root" -Recurse | Where-Object {$_.FullName -notlike "*Folder2\*.pdb*"} | Export-CSV "C:\Root\Export.csv" -NoType

尝试,测试和一个班轮:-)。这有效,因为我已复制您的文件夹和文件结构以进行复制。很抱歉,它迟到了几年。

显然,随意调整代码以满足您的需求。

于 2015-12-02T11:01:53.880 回答
4

OhadH 的答案几乎就在那里。

您可以使用

Get-ChildItem -Recurse | Where-Object {$_.FullName -notmatch "folder2" -or $_.Name -notlike "*.pdb" } 

或者

Get-ChildItem -Recurse | ? {$_.FullName -notlike "*folder2*" -or $_.Name -notlike "*.pdb" } 

这取决于您的文件夹 2 所在的位置。但我想你明白了。

我不想这么说,但 PowerShell 不像Bash或其他 shell 那样方便。

于 2013-04-11T14:31:40.970 回答
0

使用星号和递归参数:

Get-ChildItem -Path "C:\Users\*\AppData\Roaming\Microsoft\"
              -Filter "*config*" -Recurse | Select -ExpandProperty FullName
于 2021-09-02T09:12:30.613 回答
-1

这应该适合你:

Get-ChildItem -Path C:\Root -Exclude "*\Folder2\*.pdb" -Recurse
于 2013-01-24T09:56:50.590 回答