Powershell - 根据阵列中的选定对象导出为CSV

时间:2013-02-27 20:29:30

标签: powershell

对于这个奇怪的标题感到抱歉,我不知道该怎么说这个问题。我对Powershell比较陌生,我正在编写一个程序。基本上,我有一个数组,用户已选择设置或希望从“$ settings_array”中存储的GWMI查询中选择“已选择”。我想将结果输出到CSV。当我尝试运行它时,只有第一个Select语句输出到CSV。输出到文本框工作正常。我知道它与每个ieration中存储在数组中的方式有​​关。 $ resultList初始化为数组($ resultList = @())。 Form和其他函数有数百行代码,但这里是相关的代码。谢谢您的帮助!如果我需要发布更多代码,请告诉我。

$colItems = GWMI Win32_NetworkAdapterConfiguration -computername $PCname -namespace "root\CimV2" -filter "IpEnabled = TRUE"
ForEach ($objItem in $colItems)
{ 
    ForEach ($objItem2 in $settings_array)
    {
        $resultList += $objItem  | Select $objItem2
        $richTextBox1.Appendtext("$objItem2" + ": " + $objItem.$objItem2 + "`r`n")
        $richtextbox1.ScrollToCaret()
    }
}
$resultList | export-csv "$ScriptDir\Exports\$Outputfile" 

2 个答案:

答案 0 :(得分:1)

CSV由行和列组成。导出的数组中的每个对象都会获得一行,每个对象都会获得每个属性的列值。每次使用单个属性向每个对象添加一个新记录/对象(每个对象只有一个属性)。您只获得第一个的原因是您的记录包含不同的属性名称。为了解决这个“非静态属性名称”问题,powershell将第一个对象的属性作为csv文件的模板。由于object2,object3等不包含相同的属性,因此它们将为空白。但是,当您使用与第一个对象具有相同属性的另一个对象时,该值也将包含在内。防爆。你得到所有网络适配器的Name属性,但其余的是空白值。

您的样本缺少信息,例如。如何构建$settings_array。如果它是一个普通的字符串数组,如:

$settings_array = "Name", "DisplayName", "Test"

$settings_array = @("Name", "DisplayName", "Test")

然后您可以将整个数组传递给select

$colItems = GWMI Win32_NetworkAdapterConfiguration -computername $PCname  -namespace "root\CimV2" -filter "IpEnabled = TRUE"
ForEach ($objItem in $colItems)
{ 
    #Write to screen
    ForEach ($objItem2 in $settings_array)
    {
        $richTextBox1.Appendtext("$objItem2" + ": " + $objItem.$objItem2 + "`r`n")
        $richtextbox1.ScrollToCaret()
    }
}
#Save to CSV
$colItems | Select-Object -Property $settings_array | export-csv "$ScriptDir\Exports\$Outputfile" 

注意最后一行。现在,foreach循环仅用于文本框内容,而最后一行用于格式化CSV。

编辑尝试此操作以获取您的设置:

Function GetSettings { 
    $out = @()
    Foreach ($objItem in $chklstGetMIPRet.CheckedItems) {
        $out += $objItem.ToString()
    } 
    $out
}
$settings_array = GetSettings

答案 1 :(得分:0)

只是一个简单的提示:您可以使用export-clixml以及任何列数导出XML格式。