2009-12-05 34 views
12

Hãy gọi tôi là ngu ngốc, nhưng tôi đang mất mái tóc của tôi với cái này.Powershell "tham gia"

Tôi có hai kết quả từ Get-WmiObject:

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

Bây giờ, tôi có thể lọc và đầu ra một tập tin CSV từ mỗi người:

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

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

Nhưng ... Làm thế quái nào tôi có thể tham gia hai đầu ra này và phạm tội gle CSV đầu ra từ cả hai? Một cái gì đó như:

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

(. Dĩ nhiên, cú pháp này là không hợp lệ Chỉ cần để hiển thị các điểm)

Trả lời

0

Bạn luôn có thể thêm bất cứ điều gì thuộc tính bạn cần đến một đối tượng PowerShell tùy chỉnh mà có những gì bạn cần và sau đó đổ các cvs. Hãy xem điều này page và xem nếu nó bộ những gì bạn cần.

+0

phải có một tốt hơn (đơn giản hơn) thay vì Thêm thành viên ... – rookie

+0

Có, trong PowerShell 2, xem ví dụ bằng cách @dangph – Jaykul

1

Còn như thế này thì sao?

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

Hầu như! Điều này thực sự trả về bốn cột, nhưng trong * TWO * dòng. Mỗi dòng có chứa hai giá trị và hai giá trị rỗng. Bây giờ, nếu chúng ta có thể tạo ra một loại "công đoàn" ... – rookie

+0

Có '-join" a "," b "', tôi đang cố gắng tìm ra cách sử dụng nó. – YOU

12

Bạn cần Powershell V2 cho những điều sau đây.

$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

Trong khi điều này làm việc hoàn hảo cho câu hỏi OPs, những người đến đây tìm kiếm việc tham gia nhiều hàng dữ liệu sẽ phải theo đuổi một chiến lược thay thế. – KyleMit

+1

@KyleMit, 'Select-Object' với các thuộc tính được tính toán có thể hữu ích cho bạn. –

0

Bạn có thể bắt đầu với một trong hai đối tượng và sau đó thêm các thuộc tính từ khác:

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

Đây có phải là những gì bạn đang tìm kiếm? Hơi lâu hơn tôi mong đợi, bởi vì cả hai cpu $ và $ mb đều có thuộc tính Tên và Nhà sản xuất. Nhưng ý tưởng chính là các đối tượng tùy chỉnh thông qua băm.

($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ó một Join-Objectfunction on PoshCode để làm điều này, nhưng nó bị chôn vùi bên trong Join-Collection và không xuất khẩu.

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

Một khi bạn đã xác định điều đó, bạn có thể sử dụng nó như thế này:

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

Hoặc giữ các biến của bạn, và làm điều đó thích:

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

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