Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 当输入路径中有方括号时,Get ChildItem-Recurse是否被破坏?_Powershell_Get Childitem - Fatal编程技术网

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

Powershell 当输入路径中有方括号时,Get ChildItem-Recurse是否被破坏?,powershell,get-childitem,Powershell,Get Childitem,好吧,我觉得这一定是PowerShell中的一个bug,但我想看看你们是否认为这听起来有问题。这是一件很容易复制的事情,但我可以理解为什么它可能不是一个特别常见的用例。我在下面介绍的步骤实际上并不是我的脚本所做的,我实际上是在计算子文件夹的大小——我只是将其浓缩为显示我的问题的最简单的可能场景 我只在PowerShell 5.0.10240.16384上尝试过此功能,但可能很快就有机会在早期版本上进行测试[编辑:我现在在PowerShell 2.0上测试过此功能,但该错误在该版本中没有出现-它按

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

我只在PowerShell 5.0.10240.16384上尝试过此功能,但可能很快就有机会在早期版本上进行测试[编辑:我现在在PowerShell 2.0上测试过此功能,但该错误在该版本中没有出现-它按预期工作]。只是一个简短的说明-我一直使用
gci
作为Get ChildItem的缩写。如果您还不知道,这也可以在PowerShell中输入。但不管你用什么别名,问题都存在

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

接下来,打开PowerShell会话并将位置设置到新的
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
,但这使得代码比需要的更长更难看


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

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

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


我无法根据PowerShell v5.1.17134.590中的OP复制此内容

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

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

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

-文字路径 最适合我的方法是使用
-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``]\'
有关方括号和转义的更多信息,请参见以下问答:


使用
-包括*
作为解决方法。哇,真管用!谢谢@RichardIrons似乎与
-Recurse
实现如何处理名称中的通配符(
[
]
)有关。如果您@MathiasR.Jessen Why
[Regex]::Replace
而不是
[System.Management.Automation.WildcardPattern]::Escape
?虽然我非常喜欢PowerShell,
Get ChildItem
cmdlet是一团乱麻。PS中有一样东西永远不会产生一致的输出。这看起来像是同一个bug,我相信它已经在Win10的大型11月更新中修复。遗憾的是,在2020年我的Win10 Enterprise 2016 LTS上仍然存在PS 5.1。我正在尝试删除日期为…[20200701]的gci文件。lo