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" という単語を含む 2 つのファイルが返されます。

「Microsoft.Powershell.Commands.GroupInfo」テキストを 2 回出力するため (上記のエラーに示されているように)、2 つのことがわかっているようです。しかし、なぜファイルへのパスではなく、これを出力するのでしょうか?

私が見落としている明らかな何かがあるに違いありませんが、何がわかりません。

あなたの助けは大歓迎です、ありがとう

4

2 に答える 2

4

これが表示される理由は、 $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
于 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 に答える