如何在PowerShell中使用通配符和目录Get-ChildItem -Exclude cmdlet

时间:2013-01-22 23:58:05

标签: powershell directory get-childitem

举一个简单的例子,假设我有一个文件夹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,但不幸的是,它没有讨论将它们与目录名称一起使用;只有文件名。

4 个答案:

答案 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