好吧,我觉得这一定是PowerShell中的一个bug,但我想看看你们是不是觉得这听起来很糟糕。这是一件很容易重现的事情,但我可以理解为什么它可能不是一个特别常见的用例。我在下面输入的步骤实际上并不是我的脚本所做的,我实际上是在计算子文件夹的大小--我只是将其压缩为显示我的问题的最简单的可能场景。
我只在PowerShell 5.0.10240.16384上试过,但可能很快就会有机会在更早的版本上测试它:我现在已经在PowerShell 2.0上测试过了,在那个版本中出现了bug does not -它按预期工作。简单说明一下--我始终使用gci
作为Get-ChildItem的缩写。如果你还不知道,这实际上也可以在PowerShell中输入。但无论您使用什么别名,问题都存在。
首先,在方便的地方创建一个名为Test [123]
的文件夹。在该文件夹中,创建两个文件。我的是Test1.txt
和Test2.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?
https://stackoverflow.com/questions/33721892
复制相似问题