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

时间:2019-06-17 14:03:33

标签: powershell get-childitem

我最近在one of the questions中回答,我发现了一个有趣的答案,该答案不应该起作用,但仍然可以起作用。问题在于如何通过名称和cd递归查找特定文件夹。

answer proposed by A guest who's called Redd是:

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

根据Get-ChildItem的文档,-Name参数应为SwitchParameter类型,并且仅负责返回名称(System.String),而不是{{1 }}。

该解决方案仍然有可能工作吗?


MCVE:

System.Object

当前输出:

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

预期输出:

test2\folder

我尝试了什么?

  1. 首先,我检查了Get-ChildItem : A positional parameter cannot be found that accepts argument 'Folder'. 是唯一的位置参数。显然是:

Get-ChildItem -Path documentation

所有其他参数都具有-Path

  1. 然后,我尝试将参数切换为如下形式:
Position: Named

它仍在工作,因此很明显表明我传递给cmdlet的不是Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10 的值。

  1. 我最后想做的是,我只是将字符串数组发送到-Name。我试图明确地做到这一点:
-Path

1 个答案:

答案 0 :(得分:1)

tl; dr:

显然,[string[]]$a = '.\','Folder' $a.GetType() Get-ChildItem -Path $a -Name -Recurse -Depth 10 # Output: PS C:\SO\56628221> $a.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String[] System.Array PS C:\SO\56628221> Get-ChildItem -Path $a -Name -Recurse -Depth 10 test test1 test2 test3 test2\folder Get-ChildItem : Cannot find path 'C:\SO\56628221\Folder' because it does not exist. At line:1 char:1 + Get-ChildItem -Path $a -Name -Recurse -Depth 10 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\SO\56628221\Folder:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand 文档的当前版本中存在错误信息,指出Get-ChildItem不再是位置。

以上已不再成立,已在this PR中进行了修复。


长答案:

实际上,值“文件夹”正在传递给-Filter参数。即使PowerShell 6 documentation says opposite-Filter也是一个位置参数。错误地,PowerShell v6 + while PowerShell 5.1 help article for Get-ChildItem中引入的更改仍然是正确的。

您运行的cmdlet:

-Filter

有效:

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

即使Get-ChildItem -Path ".\" -Name -Filter "Folder" -Recurse -Depth 10 might be tricky in usage中的-Filter参数在这种情况下也可以正常工作,并且该过滤器仅应用于显示名为“文件夹”的项目。由于该调用未指定Get-ChildItem-File,因此您可以运行:

-Directory

然后再次运行该cmdlet,它将同时返回创建的文件和文件夹:

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

如果您明确使用PS C:\SO\56628221> Get-ChildItem -Path .\ -Name Folder -Recurse -Depth 10 Folder test2\folder ,则输出将完全相同:

-Filter