好吧,所以我感觉是这样的must是 PowerShell 中的一个错误,但我想看看你们是否认为这听起来很糟糕。这是一件很容易重现的事情,但我可以理解为什么它可能不是一个特别常见的用例。我在下面列出的步骤实际上并不是我的脚本正在执行的操作,我实际上是在计算子文件夹的大小 - 我只是将其压缩为显示我的问题的最简单的可能场景。
我只在 PowerShell 5.0.10240.16384 上尝试过此操作,但可能很快就有机会在早期版本上进行测试[Edit:我现在已经在 PowerShell 2.0 上对此进行了测试,并且该错误确实存在not出现在该版本中 - 它按预期工作]。只是一个简短的说明 - 我用过gci
全文作为 Get-ChildItem 的缩写。如果您还不知道,这也适用于实际输入 PowerShell。但无论您使用什么别名,问题都存在。
首先,创建一个文件夹,名为Test [123]
方便的地方。在该文件夹中,创建几个文件。我的叫做Test1.txt
and Test2.txt
。他们不需要有任何东西。
接下来,打开 PowerShell 会话并Set-Location
to the 父文件夹你的新的Test [123]
folder.
现在,运行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]
folder.
现在试试这个:gci -Filter Test* | gci -Recurse
。我们所改变的只是第二次调用gci
现在是递归的,所以它应该向我们显示所有文件,包括子文件夹。我们没有任何子文件夹,所以我们期望相同的结果,对吧?
错误的。我们根本没有得到任何输出。看起来很奇怪,我们所做的一切都是添加的-Recurse
现在我们得到不同的输出。我认为添加-Recurse
永远不应该渲染less输出,只会更多。
这是下一个奇怪的事情。现在尝试gci -Filter Test* | gci -Recurse -Name
。这与以前相同,除了-Name
已添加参数。这只是说我们想要相同的输出,只是我们只想要文件名而不是每个项目的完整信息。所以我们可能不期待任何回报。但这不是我们得到的,我们得到的是:
Test1.txt
Test2.txt
这有got被打破,对吗?首先-Recurse
永远不应该减少输出量,其次要求不同格式的输出不应该改变我们得到的输出量。
仅当文件夹名称中有方括号时才会发生这种情况。如果您创建另一个文件夹,只需调用Test
,然后再次运行上面的所有命令,您将始终看到来自Test
folder.
我的研究引导我-LiteralPath
范围;但是,将上述命令改写为gci -Filter Test* | foreach { gci -Recurse -LiteralPath $_ }
,以便使用该参数,仍然不返回任何输出,并且再次添加-Name
参数开始再次返回文件。
我已经设法解决这个问题,使用-Name
参数,然后将其与我正在搜索的文件夹的路径组合,然后将其传递到Get-Item
,但这使得代码比需要的更长、更丑。
所以我的问题是,我是否犯了错误或误解了什么?或者这是我应该报告的错误吗?