【问题标题】:Powershell "join"Powershell“加入”
【发布时间】:2010-12-23 11:49:12
【问题描述】:

说我笨,但我用这个会掉头发。

我有两个来自 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

(当然,这个语法是无效的,只是为了说明问题)

【问题讨论】:

    标签: powershell join


    【解决方案1】:

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

    【讨论】:

    • 虽然这对于 OP 问题非常有效,但那些来这里寻找加入多行数据的人将不得不寻求替代策略。
    • @KyleMit, Select-Object 具有计算属性可能对您有用。
    【解决方案2】:

    有一个 Join-Object function on PoshCode 用于执行此操作,但它被埋在 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
    

    【讨论】:

      【解决方案3】:

      这样怎么样?

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

      【讨论】:

      • 几乎!这实际上返回四列,但在 TWO 行中。每行包含两个值和两个空值。现在,如果我们可以建立一种“联合”......
      • -join "a","b",我正在研究如何使用。
      【解决方案4】:

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

      【讨论】:

      • 在 PowerShell 2 中,请参阅@dangph 的示例
      【解决方案5】:

      这就是你要找的吗? 比我预期的要长一些,因为 $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
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          In Powershell, what's the best way to join two tables into one? 中描述的Join-Object 具有更多功能,但也可以这样使用:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-05
            • 2011-02-10
            • 1970-01-01
            • 1970-01-01
            • 2014-09-30
            • 2016-02-18
            相关资源
            最近更新 更多