首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当输入路径中有方括号时,Get-ChildItem -Recurse是否损坏?

当输入路径中有方括号时,Get-ChildItem -Recurse是否损坏?
EN

Stack Overflow用户
提问于 2015-11-16 00:16:55
回答 2查看 2.2K关注 0票数 11

好吧,我觉得这一定是PowerShell中的一个bug,但我想看看你们是不是觉得这听起来很糟糕。这是一件很容易重现的事情,但我可以理解为什么它可能不是一个特别常见的用例。我在下面输入的步骤实际上并不是我的脚本所做的,我实际上是在计算子文件夹的大小--我只是将其压缩为显示我的问题的最简单的可能场景。

我只在PowerShell 5.0.10240.16384上试过,但可能很快就会有机会在更早的版本上测试它:我现在已经在PowerShell 2.0上测试过了,在那个版本中出现了bug does not -它按预期工作。简单说明一下--我始终使用gci作为Get-ChildItem的缩写。如果你还不知道,这实际上也可以在PowerShell中输入。但无论您使用什么别名,问题都存在。

首先,在方便的地方创建一个名为Test [123]的文件夹。在该文件夹中,创建两个文件。我的是Test1.txtTest2.txt。他们不需要有任何东西在里面。

接下来,打开PowerShell会话并通过Set-Location连接到新Test [123]文件夹的父文件夹。

现在,运行gci -Filter Test*,您应该会看到类似这样的内容:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       11/15/2015   3:22 PM                Test [123]

都很好,对吧?接下来,尝试gci -Filter Test* | gci。这使得第一个gci的输出成为下一个gci的输入,即向我们显示第一个gci返回的每一项的子项。这为我们提供了以下内容:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       11/14/2015  10:21 PM              0 Test1.txt
-a----       11/15/2015   3:55 PM              0 Test2.txt

再说一次,一切都很好--完全符合预期。这是我们的Test [123]文件夹中的所有文件。

现在试试这个:gci -Filter Test* | gci -Recurse。我们所改变的是,对gci的第二次调用现在是递归的,所以它应该会显示所有文件,包括子文件夹。我们没有任何子文件夹,所以我们期望得到相同的结果,对吧?

不对。我们根本得不到任何输出。看起来很奇怪,我们所做的一切只是添加了-Recurse,而现在我们得到了不同的输出。我认为添加-Recurse不应该呈现更少的输出,而只会呈现更多。

这是下一个奇怪的事情。现在试试gci -Filter Test* | gci -Recurse -Name。这与之前相同,只是添加了-Name参数。这只是说我们想要相同的输出,除了我们只想要文件名,而不是关于每一项的完整信息。所以我们可能什么都不想要。但这不是我们得到的,我们得到的是:

Test1.txt
Test2.txt

这一定是坏了,对吧?首先,-Recurse永远不应该减少输出量,其次,要求不同格式的输出不应该改变我们得到的输出量。

只有当文件夹名称中有方括号时,才会发生这种情况。如果您创建另一个名为Test的文件夹,并再次运行上面的所有命令,您将始终看到Test文件夹中的文件。

我的研究将我引向-LiteralPath参数;但是,将上面的命令改写为gci -Filter Test* | foreach { gci -Recurse -LiteralPath $_ },以便使用该参数,仍然不返回任何输出,并且再次添加-Name参数将再次启动返回的文件。

我已经设法解决了这个问题,使用-Name参数,然后将它与我正在搜索的文件夹的路径组合在一起,然后将其传递给Get-Item,但这会使代码变得比需要的更长、更难看。

所以我的问题是,我是不是犯了一个错误或者误解了什么?或者这是我应该报告的bug?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-27 07:45:47

TL;DR:当文件夹名称中可能有不常见的字符(包括方括号)时,请使用-LiteralPath

根据PowerShell v5.1.17134.590中的操作,我无法重现这一点。

但是,我能够重现类似的东西,使用以下命令尝试列出我怀疑为空的文件夹中的文件,以便将其删除。实际上,这个文件夹中有12个.mp3文件:

[PS]> gci '.\Music\Artist - Name\Album Name [Disc 1]\'

[PS]>

添加-Recurse开关会导致cmdlet返回错误,而不是上面所示的(误导性的)空响应。我使用-Include *选项测试了相同的命令,仍然没有结果,但是这一次与-Recurse开关结合使用时没有错误。

-LiteralPath

对我来说最有效的方法是用-LiteralPath参数指定路径:

[PS]> gci -LiteralPath '.\Music\Artist - Name\Album Name [Disc 1]\'

转义

为了涵盖其他一些可能的情况,您可能希望尝试转义方括号。在OP的评论中使用@PetSerAl的建议,你可以尝试如下所示:

[PS]> [System.Management.Automation.WildcardPattern]::Escape('.\Music\Artist - Name\Album Name [Disc 1]\')

.\Music\Artist - Name\Album Name `[Disc 1`]\

遗憾的是,这并没有立即起作用。我发现我需要转义两次,然后下面的命令给出了正确的目录列表:

[PS]> gci '.\Music\Artist - Name\Album Name ``[Disc 1``]\'

有关方括号和转义的更多信息,请参阅以下问答:

票数 4
EN

Stack Overflow用户

发布于 2015-11-16 00:33:32

它看起来像是here报告的错误或非常类似的问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33721892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档