zdan の役立つ回答[1]
を代替手段で補完するには:
特定のオブジェクトのプロパティの値だけが必要な場合は、コマンドをラップして次のように(...)
使用します.<propertyName>
。
(Get-ItemProperty 'C:\Program Files\McAfee').LastWriteTime # returns a [datetime] instance
PSv3+ では、上記は複数の項目 (配列) を返すコマンドでも機能します。この場合、入力項目の個々のプロパティ値の配列が出力されます。この機能はメンバー列挙と呼ばれます。
PSv3 では、ここでも利用できる%
/ ForEach-Object
(および?
/ ) のショートカット構文が導入されました。Where-Object
Get-ItemProperty 'C:\Program Files\McAfee' | % LastWriteTime # ditto
これは、より冗長なものと同等です (これは PSv2- でも機能します):
Get-ItemProperty 'C:\Program Files\McAfee' | % { $_.LastWriteTime }
これら 2 つのパイプライン ベースの構文形式は低速ですが、次の 2 つの利点があります。
最後に、PSv4+ では、.ForEach()
コレクションメソッドを使用することもできます。これは、パイプラインを使用しないため高速です (ただし、メンバーの列挙よりもわずかに遅くなります)。ただし、メンバーの列挙と同様に、入力コレクションが完全にメモリ内にある必要があります。
(Get-ItemProperty 'C:\Program Files\McAfee').ForEach('LastWriteTime')
[1]Select-Object
の動作の簡単な概要:
Select-Object [-Property] <string[]>
指定されたプロパティのみを含む、各入力オブジェクトのカスタム オブジェクトを返します。プロパティが1 つしか指定されていない場合でも、結果はプロパティ値自体ではなく、その 1 つのプロパティを持つカスタム オブジェクトになります。
対照的に、usingは代わりに、各入力オブジェクトから指定され-ExpandProperty <string>
た単一のプロパティの値を返します (そのまま型付けされます)。
簡単な例:呼び出しYear
からプロパティ値を抽出します。Get-Date
# WRONG: with (implied) -Property
PS> $val = Get-Date | Select-Object Year; "$val"
@{Year=2018} # !!
# A custom object with a Year property was returned and the above is its
# string representation, the equivalent of:
# "$([pscustomobject] @{ Year = 2018 })"
# CORRECT: with -ExpandProperty
PS> $val = Get-Date | Select-Object -ExpandProperty Year; "$val"
2018 # OK: -ExpandProperty extracted just the property's *value*