我最近在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 }}。
该解决方案仍然有可能工作吗?
System.Object
当前输出:
# cd C:\SO\56628221
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
它仍在工作,因此很明显表明我传递给cmdlet的不是Get-ChildItem -Path .\ Folder -Name -Recurse -Depth 10
的值。
-Name
。我试图明确地做到这一点:-Path
答案 0 :(得分:1)
显然, [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