Powershell“;加入;

Powershell“;加入;,powershell,join,Powershell,Join,说我蠢吧,但这件事让我毛骨悚然 我从Get WmiObject得到两个结果: $cpu = Get-WmiObject -Class Win32_Processor $mb = Get-WmiObject -Class Win32_BaseBoard 现在,我可以从每个文件中筛选并输出CSV文件: $cpu | Select-Object Name, Description | ConvertTo-Csv -NoTypeInformation 及 但是。。。我怎么才能将这两个输出连接起来,

说我蠢吧,但这件事让我毛骨悚然

我从Get WmiObject得到两个结果:

$cpu = Get-WmiObject -Class Win32_Processor 
$mb = Get-WmiObject -Class Win32_BaseBoard
现在,我可以从每个文件中筛选并输出CSV文件:

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

但是。。。我怎么才能将这两个输出连接起来,并从这两个输出中生成一个CSV输出?比如:

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

(当然,此语法无效。只是为了说明这一点)

您始终可以向具有所需内容的自定义powershell对象添加所需的任何属性,然后转储cvs。看看这个,看看它是否适合你的需要

像这样怎么样

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

您需要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

可以从任一对象开始,然后从另一个对象添加属性:

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

这就是你要找的吗? 比我预期的要长一些,因为$cpu和$mb都有名称和制造商属性。但其基本思想是通过散列来创建自定义对象

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

有一个用于执行此操作的
Join对象
,但它隐藏在
Join集合
中,并且没有导出

 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 | Select-Object Name, Description | Join-Object ($mb | Select-Object Manufacturer, Product)
或者保留您的变量,并按如下方式操作:

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

Join-Object $cpu $mb  | Select Name, Description, Manufacturer, Product
中介绍的具有更多功能,但也可以这样使用:

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

几乎!这实际上返回四列,但分为两行。每行包含两个值和两个空值。现在,如果我们可以建立一种“联合”…有
-加入“a”,“b”
,我正在试图找出如何使用它。在PowerShell 2中,有@dangph的例子。虽然这对OPs问题非常有效,但来这里寻求加入多行数据的人将不得不采用另一种策略。@KyleMit,
选择具有计算属性的对象
可能对您有用。