1

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

$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" 
4

2 回答 2

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
于 2013-02-27T20:49:29.560 回答
1

只是一个简单的提示:您可以使用 export-clixml 以 XML 格式导出,无论列数是多少,它们都会添加到文件中。

于 2013-05-08T09:49:06.850 回答