是否可以使用 Get-ChildItem -Name 进行过滤?

Is it possible to filter using Get-ChildItem -Name?

中,我最近回答了一个有趣的答案,它不应该起作用但仍然有效。问题是关于如何通过名称和 cd 递归查找特定文件夹。

是:

Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10

根据 Get-ChildItem 的文档,-Name 参数应该是 SwitchParameter 类型,并且只负责返回名称 (System.String),而不是 System.Object.

解决方案怎么可能仍然有效?


MCVE:

# cd C:\SO628221
mkdir test, test1, test2, test3
mkdir .\test2\folder
Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10

当前输出:

test2\folder

预期输出:

Get-ChildItem : A positional parameter cannot be found that accepts argument 'Folder'.

我尝试了什么?

  1. 首先我检查了 -Path 是唯一的位置参数。显然是:

所有其他参数都有 Position: Named

  1. 然后我尝试将参数转换成这样:
Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10

它仍在工作,所以这清楚地表明我传递给 cmdlet 的不是 -Name.

的值
  1. 我最后想到的是我只是将字符串数组发送到 -Path。我试图明确地做到这一点:
[string[]]$a = '.\','Folder'
$a.GetType()
Get-ChildItem -Path $a -Name -Recurse -Depth 10

# Output:
PS C:\SO628221> $a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String[]                                 System.Array


PS C:\SO628221> Get-ChildItem -Path $a -Name -Recurse -Depth 10
test
test1
test2
test3
test2\folder
Get-ChildItem : Cannot find path 'C:\SO628221\Folder' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Path $a -Name -Recurse -Depth 10
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\SO628221\Folder:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

tl;博士:

显然 Get-ChildItem 文档的当前版本中有一个不正确的信息,指出 -Filter 不再是位置。

以上不再正确,已在 this PR 中修复。


长答案:

实际上,值 'Folder' 被传递给 -Filter 参数。尽管 PowerShell 6 documentation says opposite, -Filter is a positional parameter. By mistake, that change was introduced in PowerShell v6+ while PowerShell 5.1 help article for Get-ChildItem 仍然正确。

您的 cmdlet 运行:

Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10

有效:

Get-ChildItem -Path ".\" -Name -Filter "Folder" -Recurse -Depth 10

即使 Get-ChildItem might be tricky in usage 中的 -Filter 参数,在这种情况下它也能完美运行并且过滤器仅应用于显示名为 'Folder' 的项目。由于该调用未指定 -File-Directory,如果您 运行:

# Create new file named 'Folder'
New-Item Folder

然后再次 运行 cmdlet,它 return 创建的文件和文件夹:

PS C:\SO628221> Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10
Folder
test2\folder

如果您明确使用 -Filter:

,则输出完全相同
PS C:\SO628221> Get-ChildItem -Path .\ -Name -Filter Folder -Recurse -Depth 10
Folder
test2\folder