2

パイピングまたはその他の種類のインライン表記を使用して、ハッシュ テーブル内の特定の値を結果に直接「選択」し、他の値を変更または設定したいと考えています。

ハッシュ表

次のようなハッシュテーブル(率直に言って、オブジェクトのように使用されています)から始めています。

>$hash

Name               Value
----               -----
System             server-1
Job                Microsoft.PowerShell.Commands.PSWmiJob
Result

Select-Object コマンドレット (またはそれに類するもの) を使用して、特定のプロパティの値を設定し、他のプロパティを通過させる方法はありますか? 私はこれで終わりたいと思います:

>$hash

Name               Value
----               -----
System             server-1
Job                Microsoft.PowerShell.Commands.PSWmiJob
Result             Good

インラインにする必要がない/したくない場合は、次の値を設定するだけですResult

$hash.Result = "good"

インライン ソリューションの場合、次のForeach-Objectように常に使用できます。

$hash | Foreach-Object {@{System=$_.System;Job=$_.Job;Result="Good"}}

または、部分式で $hash を直接参照するだけです。

${@{System=$hash.System;Job=$hash.Job;Result="Good"}}

ただし、1 つのハッシュ テーブルのみを処理している場合に使用するのは無意味に思えます。Foreach-Objectとにかく通過させたいプロパティを 2 回言及するのは非常に冗長であり、$hash変数が$aSignificantlyLongerHashTableVariableName.

Powershell オブジェクトを使用していた場合...

このようなオブジェクトを使用していた場合:

>$obj

System        Job                                      Result
------        ---                                      ---
server-1      Microsoft.PowerShell.Commands.PSWmiJob             

select-object次のようにコマンドレットを使用します。

>$obj | Select-Object System, Job, @{Name="Result";Expression="Good"}

その結果、

>$obj

System        Job                                      Result
------        ---                                      ---
server-1      Microsoft.PowerShell.Commands.PSWmiJob   Good

Hashtable と PSObject にはいくつかの類似した側面 (名前付きの方法で他のものを含むもの) がありますが、私の知る限り、それらは互換性がありません -Select-Object私がここでやろうとしていることにより近い代替手段はありますか?

4

4 に答える 4

0

Select-Object存在しなかった列 (プロパティ) を使用して追加すると、基本的[PSObject]には元の列をラップする新しい列が作成されます。これを明示的に行い、 a を使用し[hashtable]てそのプロパティを開始するには、次の 2 つの方法があります。

$obj = [PSCustomObject]$hash

また

$obj = New-Object PSObject -Property $hash

そこから、Select-Object通常どおり使用できます。最初にハッシュを操作して必要なプロパティを取得してから、オブジェクトに変換してスキップすることもできますSelect-Object

于 2016-03-03T15:33:34.737 に答える
0

単一の値のオブジェクトを解析するには、これを使用します。

$hash = @{}
$hash.Add("System",$obj.System)
$hash.Add("Job"=$obj.job)
$hash.Add("Result"="Good")

さらにオブジェクトが必要な場合は、それらforeach($o in $obj){$hash.Add()}を繰り返しますが、サイクルの前に $hash を発表します。

于 2016-03-03T15:24:25.000 に答える