Powershell "присоединиться" - PullRequest
       18

Powershell "присоединиться"

12 голосов
/ 05 декабря 2009

Назовите меня глупым, но я теряю свои волосы с этим.

У меня есть два результата от Get-WmiObject:

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

Теперь я могу отфильтровать и вывести файл CSV из каждого:

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

и

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

Но ... Как, черт возьми, я могу соединить эти два выхода и сделать один выход CSV из обоих? Что-то вроде:

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

(конечно, этот синтаксис недействителен. Просто чтобы показать точку)

Ответы [ 6 ]

12 голосов
/ 05 декабря 2009

Вам необходим 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
5 голосов
/ 14 декабря 2009

Для этого в PoshCode есть функция Join-Object , но она скрыта внутри 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
1 голос
/ 05 декабря 2009

Как насчет этого?

echo $cpu $mb | Select-Object Name, Description, Manufacturer, Product | ConvertTo-Csv -NoTypeInformation
0 голосов
/ 14 декабря 2009

Это то, что вы ищете? Несколько дольше, чем я ожидал, потому что и $ 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
0 голосов
/ 05 декабря 2009

Вы можете начать с любого объекта, а затем добавить свойства другого:

$cpu | Select-Object Name, Description | 
  add-member noteproperty Manufacturer $mb.Manufacturer -PassThru | 
  add-member noteproperty Product      $mb.Product      -PassThru
0 голосов
/ 05 декабря 2009

Вы всегда можете добавить любые свойства, которые вам нужны, к пользовательскому объекту PowerShell, который имеет то, что вам нужно, и затем вывести cvs. Посмотрите на эту страницу и посмотрите, подходит ли она вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...