12

现在我使用 PowerShell 5.0.10586.0 更新到 Windows 10 TH2 Build 10586

现在我遇到了 Get-ChildItem 的问题

$files = Get-ChildItem -LiteralPath $path -Force -Recurse -Include *.txt

这将返回 $path 中的所有文件,即使它们不是 .txt。这在更新之前有效。当我将其更改为

$files = Get-ChildItem -Path $path -Force -Recurse -Include *.txt

它再次起作用。但这不是我想要的。这是一个错误还是我做错了什么?

4

3 回答 3

7

就个人而言,我从不使用-Include-Exclude不再使用。我总是通过管道Where-Object。我不知道-Includeand的作者是-Exclude不是疯了,或者底层的 .Net 提供程序是否存在问题,但它们非常脆弱。

我在 5.0.10240.16384。

gci -Path $path -Include *.txt -Force

什么都不返回。

gci -LiteralPath $path -Include *.txt -Force

返回$path.

gci -LiteralPath $path -Include *.txt -Force -Recurse
gci -Path $path -Include *.txt -Force -Recurse

两者都返回 *.txt$path和所有子文件夹。

那么正确的行为应该是什么?-Recurse标志是否修改了-Include工作方式?我不知道。我不再关心了。我不会处理这种行为。我只是用这个:

gci -Path $path -Recurse -Force | Where-Object { $_.Extension -eq '.txt' }

我依靠Get-ChildItem枚举文件和文件夹,就是这样。只要给我对象,我就会过滤它们。就像所有的旧Remove-Item -Recurse错误一样,那里有些东西并没有按照人们期望的方式工作。

于 2015-11-14T00:43:30.040 回答
3

注意-Filter好像没有这个问题。这有效:

$files = Get-ChildItem -LiteralPath $path -Force -Recurse -Filter *.txt

Filter更有效,因为它由底层提供程序使用(与IncludePowerShell 本身应用的不同,很像where您的代码添加的子句)。

但是Filter只接受一个模式参数,而Include支持多个模式

于 2017-11-14T15:08:03.120 回答
2

我认为这是一种回归。我将它作为v5 回归提交:Get-ChildItem -LiteralPath -Recurse ignores -Include and get all items

于 2015-12-22T03:00:28.910 回答