Powershell 是否可以使用Get-ChildItem-Name进行筛选?

Powershell 是否可以使用Get-ChildItem-Name进行筛选?,powershell,get-childitem,Powershell,Get Childitem,在我最近的回答中,我发现了一个有趣的答案,这个答案本不应该有效,但仍然有效。问题是如何通过名称和cd递归查找特定文件夹 结果是: Get ChildItem-Path.\-Name Folder-Recurse-Depth 10 根据的文档,-Name参数应该是SwitchParameter类型,并且只负责返回名称(System.String),而不是System.Object 这个解决方案怎么可能仍然有效 MCVE: #cd C:\SO\56628221 mkdir测试,测试1,测试2,测

在我最近的回答中,我发现了一个有趣的答案,这个答案本不应该有效,但仍然有效。问题是如何通过名称和
cd
递归查找特定文件夹

结果是:

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

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


MCVE:
#cd C:\SO\56628221
mkdir测试,测试1,测试2,测试3
mkdir.\test2\文件夹
Get ChildItem-Path.\-Name Folder-Recurse-Depth 10
电流输出:

test2\folder
预期产出:

Get ChildItem:找不到接受参数“Folder”的位置参数。

我试过什么?
  • 首先,我检查了
    -Path
    是唯一的位置参数。显然是:
  • 所有其他参数都有
    位置:Named

  • 然后我尝试将参数转换为如下内容:
  • Get ChildItem-Path.\Folder-Name-Recurse-Depth 10
    
    它仍在工作,因此这清楚地表明我传递给cmdlet的不是
    -Name
    的值

  • 我最后想的是,我只是将字符串数组发送到
    -Path
    。我试图明确地做到这一点:
  • [string[]]a='.\','Folder'
    $a.GetType()
    获取ChildItem-Path$a-Name-Recurse-Depth 10
    #输出:
    PS C:\SO\56628221>$a.GetType()
    IsPublic IsSerial名称基类型
    -------- -------- ----                                     --------
    True字符串[]System.Array
    PS C:\SO\56628221>获取ChildItem-Path$a-Name-Recurse-Depth 10
    测试
    测试1
    测试2
    测试3
    test2\文件夹
    Get-ChildItem:找不到路径“C:\SO\56628221\Folder”,因为它不存在。
    第1行字符:1
    +获取ChildItem-Path$a-Name-Recurse-Depth 10
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +CategoryInfo:ObjectNotFound:(C:\SO\56628221\Folder:String)[Get ChildItem],ItemNotFoundException
    +FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    
    tl;博士: 显然,当前版本的
    Get ChildItem
    文档中有一条不正确的信息,说明
    -Filter
    不再处于位置

    上述情况已不复存在,已被修正


    长答覆: 事实上,值“Folder”正在传递给
    -Filter
    参数。即使,
    -Filter
    是一个位置参数。错误的是,在PowerShell v6+中引入的更改仍然是正确的

    您运行的cmdlet:

    Get ChildItem-Path.\-Name Folder-Recurse-Depth 10
    
    实际上:

    Get ChildItem-Path.“\”-Name-Filter“Folder”-递归-深度10
    
    即使
    Get ChildItem
    中的
    -Filter
    参数,在这种情况下,它工作正常,并且过滤器仅应用于显示名为“Folder”的项目。由于该调用未指定
    -File
    -Directory
    ,如果您运行:

    #创建名为“文件夹”的新文件
    新项目文件夹
    
    然后再次运行cmdlet,它将返回创建的文件和文件夹:

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

    PS C:\SO\56628221>Get ChildItem-Path.\-Name-Filter Folder-Recurse-Depth 10
    文件夹
    test2\文件夹
    
    我打开了公关部,说:谢谢你的解释。有时,我想看到事情碰巧发生是很有趣的:)@Aguestwho'scalledRedd不客气!如果你认为有价值的话,请随意投票。事实上,这是你应得的;)