是否可以使用 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'.
我尝试了什么?
- 首先我检查了
-Path
是唯一的位置参数。显然是:
所有其他参数都有 Position: Named
。
- 然后我尝试将参数转换成这样:
Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10
它仍在工作,所以这清楚地表明我传递给 cmdlet 的不是 -Name
.
的值
- 我最后想到的是我只是将字符串数组发送到
-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
在 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'.
我尝试了什么?
- 首先我检查了
-Path
是唯一的位置参数。显然是:
所有其他参数都有 Position: Named
。
- 然后我尝试将参数转换成这样:
Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10
它仍在工作,所以这清楚地表明我传递给 cmdlet 的不是 -Name
.
- 我最后想到的是我只是将字符串数组发送到
-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