2009-12-05 10 views
12

Chiamami stupido, ma mi sto perdendo i capelli con questo.Powershell "join"

ho due risultati da un Get-WmiObject:

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

Ora, posso filtrare e di output un file CSV da ciascuno di essi:

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

e

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

Ma ... Come diavolo ho potuto unire queste due uscite e fare un peccato gle CSV in uscita da entrambi? Qualcosa di simile:

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

(. Naturalmente, questa sintassi non è valida solo per mostrare il punto)

risposta

0

È sempre possibile aggiungere qualsiasi proprietà è necessario un oggetto PowerShell personalizzato che ha quello che ti serve e poi scaricare il cvs. Dai uno sguardo a questo page e verifica se soddisfa le tue esigenze.

+0

ci deve essere un migliore (più semplice) invece di Add-Member ... – rookie

+0

Esiste, in PowerShell 2, vedere l'esempio di @dangph – Jaykul

1

Che ne dici di questo?

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

Quasi! In realtà restituisce quattro colonne, ma in * DUE * linee. Ogni riga contenente due valori e due valori nulli. Ora, se potessimo fare una sorta di "unione" ... – rookie

+0

C'è '-join" a "," b "', sto cercando di capire come usarlo. – YOU

12

È necessario Powershell V2 per quanto segue.

$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

Mentre questo funziona perfettamente per la domanda OPs, quelli che stanno venendo qui cercando di unire più file di dati dovranno perseguire una strategia alternativa. – KyleMit

+1

@KyleMit, 'Select-Object' con proprietà calcolate potrebbe essere utile. –

0

Si può iniziare con uno dei due oggetti e quindi aggiungere le proprietà dall'altra:

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

E 'questo quello che stai cercando? Un po 'più di quanto mi aspettassi, perché sia ​​$ cpu che $ mb hanno nome e proprietà del produttore. Ma l'idea principale sono gli oggetti personalizzati attraverso l'hashing.

($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

C'è un Join-Objectfunction on PoshCode per fare questo, ma è sepolto all'interno Join-Collection e non esportati.

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 
    } 
} 

Una volta definito questo, si può usare in questo modo:

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

o di tenere le variabili, e farlo come:

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

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