Powershell“;加入;
说我蠢吧,但这件事让我毛骨悚然 我从Get WmiObject得到两个结果: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 及 但是。。。我怎么才能将这两个输出连接起来,
$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,选择具有计算属性的对象
可能对您有用。