2009-12-05 13 views
12

Llámame estúpido, pero estoy perdiendo mi cabello con este.Powershell "join"

que tienen dos resultados de un Get-WmiObject:

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

Ahora, puedo filtrar y salida de un archivo CSV de cada uno:

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

y

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

Pero ... ¿cómo demonios podría yo unirme a estas dos salidas y hacer un pecado gle CSV salida de ambos? Algo así como:

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

(. Por supuesto, esta sintaxis no es válida sólo para mostrar el punto)

Respuesta

0

Siempre se puede añadir las propiedades que se necesita un objeto PowerShell personalizada que tiene lo que necesita y luego volcar los cvs. Eche un vistazo a este page y vea si ofrece lo que necesita.

+0

tiene que haber una mejor (más simple) en lugar de Add-Member ... – rookie

+0

Hay, en PowerShell 2, vea el ejemplo de @dangph – Jaykul

1

¿Qué le parece esto?

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

¡Casi! Esto realmente devuelve cuatro columnas, pero en * DOS * líneas. Cada línea contiene dos valores y dos valores nulos. Ahora, si pudiéramos hacer una especie de "unión" ... – rookie

+0

Hay '-join" a "," b "', estoy intentando descubrir cómo usarlo. – YOU

12

Necesita Powershell V2 para lo siguiente.

$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

Si bien esto funciona perfectamente para la pregunta de OP, quienes vienen aquí buscando unir múltiples filas de datos tendrán que buscar una estrategia alternativa. – KyleMit

+1

@KyleMit, 'Seleccionar-Objeto' con propiedades calculadas puede ser útil para usted. –

0

Puede comenzar con cualquiera de los objetos y luego agregar propiedades de la otra:

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

¿Es esto lo que busca? Algo más largo de lo que esperaba, porque tanto $ cpu como $ mb tienen propiedades de Nombre y Fabricante. Pero la idea principal es los objetos personalizados mediante hash.

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

Hay una Join-Objectfunction on PoshCode para hacer esto, pero es enterrado dentro Join-Collection y no exportan.

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 vez que haya definido eso, se puede utilizar de esta manera:

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

o mantienen sus variables, y hacerlo como:

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

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