これが表示される理由は、 $output が Selected.Microsoft.PowerShell.Commands.GroupInfo オブジェクトの配列であるためです。これは、Select-Object に渡されたときに Group-Object によって返されるオブジェクトです (Select-Object がなければ、単に Microsoft.代わりに .PowerShell.Commands.GroupInfo オブジェクト)。次のコマンドを実行して、$output 内のオブジェクトのタイプを確認できます。
$output | Get-Member
出力の上部に表示される TypeName を確認します。
これらのコマンドをコンソールで対話的に実行すると、パスが表示されます。これは、PowerShell が GroupInfo オブジェクトをコンソールに表示して人間が判読できるようにする方法を知っているためです。コンソールで $output を呼び出すと、ダッシュ文字で下線が引かれた "Name" ヘッダーが表示されることに注意してください。これは、PowerShell が指定した GroupInfo オブジェクトを解釈し、Name プロパティをコンソールに表示します。
この問題は、$output 配列を文字列内に出力しようとすると発生します。その場合、PowerShell はより高度な書式設定ロジックを使用できず、代わりにオブジェクトを文字列に変換して文字列に挿入しようとします。その場合、文字列に実際に表示したいのはこれらの GroupInfo オブジェクトの Name プロパティであることを知るための十分なロジックがないため、代わりに、各オブジェクトの型名を含む文字列を出力するだけの場合$output配列で。そのため、タイプ名が 2 回表示されます。
この問題の簡単な解決策は、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