get-childitem with -recurse导致-contains匹配在比较$ GitStatus时表现不同

时间:2012-03-20 23:17:15

标签: git powershell posh-git

在powershell中使用posh-git我能够通过使用集合变量$ GitStatus.Working列出工作树中已更改的所有项目,我可以在where子句中使用此列表来过滤目录列表,如所以

dir | where {$GitStatus.Working -contains $_.Name}

这非常适合显示当前目录中已更改但尚未在索引中的所有文件,但是当我使用-recurse指令运行此相同命令时,文件不再匹配。我不明白为什么。有什么想法吗?

(注意来自Scott Hanselman的Posh-GiTDir遭遇同样的问题,因为他使用基本相同的技术,显示“Git”列并不奇怪)

编辑:当我发现当我进行递归目录列表时,Posh-GitDir Git列没有显示任何内容时,就开始了。能够快速查看“从这个文件夹中”发生了什么变化是很有用的,我看看Posh-GitDir如何获取其信息以尝试调试它为什么不能用于递归。

1 个答案:

答案 0 :(得分:1)

这是因为您使用的是$_.Name,但当您执行git status时,$GitStatus将从Posh-Git中提供给您,它将提供目录和文件名。因此,当您仅考虑当前文件夹(dir没有-recurse)时,它会找到,因为它只是名称。但是当您考虑目录中的文件时,它们将是相对路径,并且与$_.name

不匹配

顺便说一下,$GitStatus.Working是支持显示处于工作目录但未添加的仓库中的文件。为什么要尝试获取所有文件的列表并使用$GitStatus.Working

中的项目对其进行过滤

如果您想要$GitStatus.Working中的FileInfo对象,请尝试执行以下操作:

$GitStatus.Working | gi

根据此答案编辑显示最终解决方案:
所以对于我的目的,我所做的是......

$working = $GitStatus.Working | gi | %{$_.FullName}
dir -recurse | where {$working -contains $_.FullName}

(编辑了编辑,之前的代码段不正确。)