对于这个奇怪的标题感到抱歉,我不知道该怎么说这个问题。我对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"
答案 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格式。