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

Posted

技术标签:

【中文标题】如何在 PowerShell 的 Get-ChildItem -Exclude cmdlet 中对目录使用通配符【英文标题】:How to use wildcards with directories in PowerShell's Get-ChildItem -Exclude cmdlet 【发布时间】:2013-01-06 08:55:45 【问题描述】:

举个简单的例子,假设我有一个文件夹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 文件会从任何文件夹中排除。

因此,通配符似乎不能用于目录,只能用于文件名,但我认为我只是做错了什么。我找到了this article explaining the wildcard and range operators,但不幸的是它没有讨论将它们与目录名称一起使用;只有文件名。

【问题讨论】:

【参考方案1】:

使用星号和递归参数:

Get-ChildItem -Path "C:\Users\*\AppData\Roaming\Microsoft\"
              -Filter "*config*" -Recurse | Select -ExpandProperty FullName

【讨论】:

【参考方案2】:
 gci "C:\Root" -Recurse | Where-Object $_.FullName -notlike "*Folder2\*.pdb*" | Export-CSV "C:\Root\Export.csv" -NoType

经过试验、测试和一个衬里:-)。这有效,因为我已复制您的文件夹和文件结构以进行复制。不过,很抱歉晚了几年。

显然,您可以根据需要随意调整代码。

【讨论】:

【参考方案3】:

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

您可以尝试通过管道连接到Where-Object。也就是说,

Get-ChildItem -Recurse *.pdb | Where-Object $_.FullName -notMatch "folder2"

【讨论】:

不,这不是我要找的。它只会返回不在 Folder2 中的 .pdb 文件,但我想要所有文件,除了 Folder2 中的 .pdb 文件。但是您可能正在通过管道进入 Where-Object 寻找可能的解决方案;虽然我仍然想知道如何在目录中使用通配符(或者如果不可能的话)。【参考方案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 方便。

【讨论】:

【参考方案5】:

这应该适合你:

Get-ChildItem -Path C:\Root -Exclude "*\Folder2\*.pdb" -Recurse

【讨论】:

不,这不起作用。仍然只是返回所有文件夹中的所有 .pdb 文件。

以上是关于如何在 PowerShell 的 Get-ChildItem -Exclude cmdlet 中对目录使用通配符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 powershell 远程会话(powershell)中编辑文件

如何在不卸载powershell的情况下,有效禁用/启用powershel

powershell 如何定时执行 ps1

powershell 如何在PowerShell中编写“按任意键继续”

powershell 如何在PowerShell中编写“按任意键继续”

如何在powershell里运行python和代码