2

我有一个问题希望有人能帮忙解决......

我有一个包含以下行的 powershell 脚本:

$output = Get-ChildItem -path $target -recurse | Select-String -pattern hello | group path | select name
Write-Output "Output from the string match is $output"

我得到的错误:

Output from the string match Microsoft.Powershell.Commands.GroupInfo Microsoft.Powershell.Commands.GroupInfo

当我自己运行此命令时(即不在脚本中),它运行良好并返回该位置中包含单词“hello”的两个文件。

它似乎知道它发现了两件事,因为它打印了两次“Microsoft.Powershell.Commands.GroupInfo”文本(如上面的错误所示)。但是为什么它打印这个而不是文件的路径呢?

一定有一些明显的东西我忽略了,但我不知道是什么。

非常感谢您的帮助,谢谢

4

2 回答 2

4

您看到这一点的原因是因为 $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
于 2013-08-20T14:58:35.893 回答
1

我相信在这里 foreach 是合适的。试试这个:

$output = Get-ChildItem -path $target -recurse | where {$_.name -like "*hello*"} | select name
foreach ($file in $output) {
   write-host $file.name
}

或这个:

$output = Get-ChildItem -path $target -recurse | select-string -pattern "hello" | select name
foreach ($file in $output) {
   write-output $file.name
}
于 2013-08-20T13:53:13.067 回答