1

カスタム オブジェクトを作成して CSV ファイルにエクスポートするスクリプトを作成しました。

$reg = Get-ItemProperty HKLM:\SOFTWARE\McAfee\DLP\Agent | Select-Object agentversion

$date = Get-ItemProperty 'C:\Program Files\McAfee' | Select-Object {$_.LastWriteTime} 

$date86 = Get-ItemProperty 'C:\Program Files (x86)\McAfee'| Select-Object {$_.LastWriteTime}

New-Object -TypeName pscustomobject -Property @{
  "Number1"=$reg
  "Number2"=$date86
  "Number3"=$date } | export-csv -Path C:\****\desktop\stuff.csv -NoTypeInformation

結果の CSV ファイルのデータ行は次のとおりです。

"@{AgentVersion=9.4.112.22}","@{$ .LastWriteTime=5/6/2016 6:02:32 AM}","@{$ .LastWriteTime=7/5/2016 8:34:01 PM }"

@{<name>=...}不要なラッパーを取り除くことは可能ですか?

4

2 に答える 2

1

表現:

Select-Object {$_.LastWriteTime}

name を持つ単一のプロパティを持つオブジェクトを出力します$_.LastWriteTime。これを修正する最も簡単な方法は、-ExpandProperty関心のある値のみを出力するパラメーターを使用することです。例:

$date86 = Get-ItemProperty 'C:\Program Files (x86)\McAfee'|
            Select-Object -ExpandProperty LastWriteTime 

また、スクリプト ブロックSelect-Objectは不要だったため、コマンドから削除したことに注意してください。

于 2016-07-12T00:06:47.330 に答える
1

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 つの利点があります。

  • 大規模な入力コレクションは、メモリ使用量を一定に保つためにパイプラインで 1 つずつ処理する方が適切です (実行可能な場合。メモリ内の出力全体を収集する必要がある場合、利点はありません)。

  • この構文は、コレクション全体のプロパティではなく、個々の項目のプロパティを明確に参照します。

    • たとえば、はコレクション(配列) のプロパティとして解釈されるため、内のファイルの(Get-ChildItem -File C:\Windows).Lengthを返します。 対照的に、個々のファイルの(ファイルサイズ) プロパティ値の配列を返します。C:\WindowsLength
      Get-ChildItem -File C:\Windows | % Length.Length

最後に、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*
于 2016-07-12T02:23:26.027 に答える