您看到这一点的原因是因为 $output 是 Selected.Microsoft.PowerShell.Commands.GroupInfo 对象的数组 - Group-Object 在传递给 Select-Object 时返回的对象(没有 Select-Object 它们只是 Microsoft .PowerShell.Commands.GroupInfo 对象)。您可以通过运行来确认 $ouput 中的对象类型:
$output | Get-Member
检查显示在输出顶部的 TypeName。
当您在控制台中以交互方式运行这些命令时,您会看到路径,因为 PowerShell 知道如何在控制台中显示 GroupInfo 对象,以便它们是人类可读的。请注意,当您在控制台中调用 $output 时,您会看到一个带有短划线字符下划线的“名称”标头——这是 PowerShell 解释您提供给它的 GroupInfo 对象并在控制台中为您显示名称属性。
当您尝试在字符串中输出 $output 数组时,就会出现问题。然后 PowerShell 无法使用其更高级的格式化逻辑,而只是尝试将对象转换为字符串以插入到您的字符串中。当它这样做时,它没有足够的逻辑来知道你真正想要出现在你的字符串中的是这些 GroupInfo 对象的 Name 属性,所以如果只是打印出一个带有每个对象的类型名称的字符串在 $output 数组中。这就是为什么您会看到两次类型名称的原因。
此问题的简单解决方案是 Select-Object 的 -ExpandProperty 参数。这正如它所说的那样——它扩展了您使用 Select-Object 请求的属性并仅返回该属性,而不是父对象。所以 GroupInfo 对象的 Name 属性是一个字符串。如果您调用Select-Object Name,您将获得一个具有 Name 属性的 GroupInfo 对象。如果您调用Select-Object -ExpandProperty Name,您将只获得作为 String 对象的 Name 属性。在这种情况下,这就是我希望你想要的。
所以试试这个:
$output = Get-ChildItem -path $target -recurse | Select-String -pattern hello | group path | select -ExpandProperty name