2014-03-05 63 views
2

我想要输出四个对象并将它们放入CSV中。将多个对象的输出合并为一个CSV

$obj1 = get-wmiobject win32_computersystem | select-object name,manufacturer,model,totalphysicalram 
$obj2 = get-wmiobject win32_processor | select-object deviceid,name,maxclockspeed,numberofcores 
$obj3 = get-wmiobject win32_bios | select-object serialnumber 
$obj4 = get-wmiobject win32_operatingsystem | select-object osarchitecture 

我想将所有这些组合到csv的同一个输出行中。

我该如何使用PowerShell?我应该建立一个对象数组吗?

回答

3

我并不认为你没有开始就没有这个想法,我不知道一年前自己的代码去哪里。试试这个,看看它是如何打你......

$obj1 = get-wmiobject win32_computersystem | select-object name,manufacturer,model,TotalPhysicalMemory 
$obj2 = get-wmiobject win32_processor | select-object deviceid,@{l="Proc";e={$_.name}},maxclockspeed,numberofcores 
$obj3 = get-wmiobject win32_bios | select-object serialnumber 
$obj4 = get-wmiobject win32_operatingsystem | select-object osarchitecture 

$Combined = New-Object -Type PSObject 
$obj1,$obj2,$obj3,$obj4|%{$CurObj = $_;$_|gm|?{$_.MemberType -match "NoteProperty"}|%{$NewMember = $_.Name;$Combined|Add-Member -MemberType NoteProperty -Name $NewMember -Value $CurObj.$NewMember}} 

我固定TotalPhysicalMemory(不totalphysicalram),并改变了PROC查询,以便它改名为名称属性PROC,这样,你没有2个属性同名。然后,我将所有4个对象都送入ForEach循环,并且为每个对象提供了它的成员,并为NoteProperty成员进行了过滤(删除了Methods以及不用的东西)。对于每一个我都使用了该成员的名称,并在我使用相同名称创建的新PSCustomObject中创建了一个属性,并为与该属性关联的原始对象分配了值。我希望这是有道理的,我发现它有点难以遵循,我写的东西...

编辑: Dur ...我没有回答原来的问题,我刚刚所有的准备工作完成。这里的输出如何你:

$Combined|Export-CSV -Path C:\SomeFolder\MachineSpecs.CSV -NoTypeInfo 
+0

非常感谢!为了将来的参考,添加任意字符串也很容易,例如:'$ obj1 = new-object system.object; $ obj1 |添加成员-MemberType NoteProperty -Name“date”-Value $(get-date -format“yyyy-MM-dd HH:mm:ss”)' – mbrownnyc

2

我试图运行TheMadTechnician对PSv3答案,它没有像外CSV cmdlet的。所以我用Export-CSV取代了它,它工作正常。

$obj1 = get-wmiobject win32_computersystem | select-object name,manufacturer,model,TotalPhysicalMemory 
$obj2 = get-wmiobject win32_processor | select-object deviceid,@{l="Proc";e={$_.name}},maxclockspeed,numberofcores 
$obj3 = get-wmiobject win32_bios | select-object serialnumber 
$obj4 = get-wmiobject win32_operatingsystem | select-object osarchitecture 

$Combined = New-Object -Type PSObject 
$obj1,$obj2,$obj3,$obj4|%{$CurObj = $_;$_|gm|?{$_.MemberType -match "NoteProperty"}|%{$NewMember = $_.Name;$Combined|Add-Member -MemberType NoteProperty -Name $NewMember -Value $CurObj.$NewMember}} 
$Combined | Export-CSV -Path H:\MachineSpecs.CSV -NoTypeInfo 

给出的输出: “制造商”, “模型”, “姓名”, “TotalPhysicalMemory”, “设备ID”, “maxclockspeed”, “numberofcores”, “处理”, “SERIALNUMBER”,”体系结构“ ”Hewlett-Packard“,”HP EliteBook 8760w“,”LAUCA-44A135“,”8537874432“,”CPU0“,”2201“,”4“,”Intel(R)Core TM i7-2670QM CPU @ 2.20GHz“,”USH244A135“,”64位“

+0

是的,你说得对。这不是一个好的命令,很好的抓住。我会更新我的答案以反映您的更正。 – TheMadTechnician

1

下面是我喜欢这个任务的可读语法,希望这会有所帮助。这会创建一个属性的散列表并将其添加到PSObject,然后将其添加到数组中。您可以根据需要使用生成的数组完成操作。我通常在针对远程计算机列表的foreach循环中运行此操作。您可以通过这种方式很轻松地报告各种不同的数据。

$Results = @() 

$obj1 = get-wmiobject win32_computersystem 
$obj2 = get-wmiobject win32_processor 
$obj3 = get-wmiobject win32_bios 
$obj4 = get-wmiobject win32_operatingsystem 

    $Obj = new-object psobject [email protected]{ 
     PropertyName = $Obj2.Property 
     SomeOtherPropertName = $obj1.Property 
     SerialNumber = $obj3.SerialNumber 
     DateCollected = (get-date).DateTime 
     OSArchitecture = $obj4.OsArchitecture 
    } 

$Results+=$obj