Powershell - 使用Get-ChildItem在文件中搜索时的奇怪输出

时间:2013-08-20 13:39:58

标签: powershell powershell-v2.0 get-childitem

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

我有一个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”文本(如上面的错误所示)。但是为什么要打印这个而不是文件的路径呢?

我必须有一些显而易见的东西,但我不知道是什么。

非常感谢您的帮助,谢谢

2 个答案:

答案 0 :(得分:4)

你看到这个的原因是因为$ output是Selected.Microsoft.PowerShell.Commands.GroupInfo对象的数组 - 当传递给Select-Object时Group-Object返回的对象(没有Select-Object它们会只是改为Microsoft.PowerShell.Commands.GroupInfo对象)。您可以通过运行:

确认$ ouput中的对象类型
$output | Get-Member

检查输出顶部显示的TypeName。

当您在控制台中以交互方式运行这些命令时,您将看到路径,因为PowerShell知道如何在控制台中显示GroupInfo对象,以便它们是人类可读的。请注意,当你在控制台中调用$ output时,会看到带有破折号字符的“Name”标题下划线 - 这是PowerShell解释你给它的GroupInfo对象并在控制台中显示你的Name属性。

当您尝试在字符串中输出$ output数组时会发生此问题。然后,PowerShell无法使用其更高级的格式化逻辑,而只是尝试将对象转换为字符串以插入到字符串中。当它这样做时,它没有足够的逻辑来知道你真正希望在字符串中出现的是这些GroupInfo对象的Name属性,所以相反,如果只是打印出一个字符串,其中包含每个对象的类型名称在$ output数组中。这就是你看到类型名称两次的原因。

此问题的简单解决方案是Select-Object的-ExpandProperty参数。这就是它所说的 - 它使用Select-Object扩展你要求的属性并返回只是该属性,而不是父对象。因此GroupInfo对象的Name属性是一个字符串。如果调用Select-Object Name,则会获得具有Name属性的GroupInfo对象。如果调用Select-Object -ExpandProperty Name,则只能将Name属性作为String对象。在这种情况下,我希望你想要的是什么。

所以试试这个:

$output = Get-ChildItem -path $target -recurse | Select-String -pattern hello | group path | select -ExpandProperty name

答案 1 :(得分: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
}