2009-12-05 8 views
12

私は愚かだと呼びますが、私はこの1つで私の髪を失っています。Powershell "join"

私がゲット-WmiObjectコマンドからの二つの結果があります。今

$cpu = Get-WmiObject -Class Win32_Processor 
$mb = Get-WmiObject -Class Win32_BaseBoard 

を、私はそれぞれ1からCSVファイルをフィルタリングして出力することができます

$cpu | Select-Object Name, Description | ConvertTo-Csv -NoTypeInformation 

$mb | Select-Object Manufacturer, Product | ConvertTo-Csv -NoTypeInformation 

しかし...どのように私はこれら2つの出力に参加し、罪を犯す両方からCSV出力を取り除く?ような何か:

( 
    ($cpu | Select-Object Name, Description) + 
    ($mb | Select-Object Manufacturer, Product) 
) | ConvertTo-Csv -NoTypeInformation 

(もちろん、この構文が無効であるだけでは、ポイントを表示する。)

答えて

0

あなたはいつもあなたが必要なものを持っているカスタムPowerShellのオブジェクトに必要なものは何でもプロパティを追加して、ダンプすることができますcvs。このpageを見て、必要なものがあるかどうか確認してください。

+0

を(より良い存在でなければなりませんAdd-Memberの代わりに簡単な方法を使用してください。 – rookie

+0

PowerShell 2には、@dangphの例があります – Jaykul

1

どのようにこのように?

echo $cpu $mb | Select-Object Name, Description, Manufacturer, Product | ConvertTo-Csv -NoTypeInformation 
+0

ほとんど!これは実際には4列を返しますが、* TWO *行に戻ります。各行には2つの値と2つのヌルが含まれます。さて、私たちが一種の "組合"を作ることができたら... – rookie

+0

'-join" a、 "b" 'があります、それをどのように使うかを考えようとしています。 – YOU

12

次の場合はPowershell V2が必要です。

$cpu = Get-WmiObject -Class Win32_Processor 
$mb = Get-WmiObject -Class Win32_BaseBoard 
$props = @{    
    Name   = $cpu.Name 
    Description = $cpu.Description 
    Manufacturer = $mb.Manufacturer 
    Product  = $mb.Product 
    } 
New-Object PSObject -Property $props | ConvertTo-Csv -NoTypeInformation 
+0

これはOPに関する質問には完全に機能しますが、複数の行のデータを結合するためにここに来る人は、代わりの戦略を実行する必要があります。 – KyleMit

+1

@KyleMit、計算されたプロパティを持つ 'Select-Object'が役に立ちます。 –

0

あなたはオブジェクトのいずれかで開始し、その後、他のプロパティを追加することができます

$cpu | Select-Object Name, Description | 
    add-member noteproperty Manufacturer $mb.Manufacturer -PassThru | 
    add-member noteproperty Product  $mb.Product  -PassThru 
0

は、あなたが探しているものを、このですか? $ cpuと$ mbの両方にNameプロパティとManufacturerプロパティがあるので、やや長いと思っていました。しかし、主なアイデアは、ハッシングによるカスタムオブジェクトです。

($cpu | Select-Object Name, Description),($mb | Select-Object Manufacturer, Product) | 
     Select-Object @{name='NameOrManu';expr={$_.Name + $_.Manufacturer}}, 
        @{name='DescrOrProd';expr={$_.Description + $_.Product}} | 
     ConvertTo-Csv -NoTypeInformation 
5

は、これを行うためのJoin-Objectfunction on PoshCodeをありますが、それはJoin-Collection内部に埋め込まれ、エクスポートいません。

function Join-Object { 
    Param(
     [Parameter(Position=0)] 
     $First 
    , 
     [Parameter(Position=1,ValueFromPipeline=$true)] 
     $Second 
    ) 
    BEGIN { 
     [string[]] $p1 = $First | gm -type Properties | select -expand Name 
    } 
    Process { 
     $Output = $First | Select $p1 
     foreach($p in $Second | gm -type Properties | Where { $p1 -notcontains $_.Name } | select -expand Name) { 
      Add-Member -in $Output -type NoteProperty -name $p -value $Second."$p" 
     } 
     $Output 
    } 
} 

あなたはこのようにそれを使用することができることを定義したら:

Join-Object (Get-WmiObject -Class Win32_Processor) (Get-WmiObject -Class Win32_BaseBoard) | 
Select Name, Description, Manufacturer, Product 

またはあなたの変数を維持し、それが好きですか:

$cpu = Get-WmiObject -Class Win32_Processor 
$mb = Get-WmiObject -Class Win32_BaseBoard 

Join-Object $cpu $mb | Select Name, Description, Manufacturer, Product