2013-02-27 99 views
1

对不起,我不知道如何标记问题。我对Powershell比较陌生,我正在编写一个程序。基本上,我有一个数组,其中用户选择了设置或希望从存储在“$ settings_array”中的GWMI查询中选择“Selected”。我想输出结果到CSV。当我尝试运行它时,只有第一个Select语句输出到CSV。输出到文本框工作正常。我知道这与它在每个区域存储在数组中的方式有​​关。 $ resultList被初始化为一个数组($ resultList = @())。 Form和其他函数有数百行代码,但这里是相关的代码。谢谢您的帮助!让我知道是否需要发布更多代码。Powershell - 根据来自阵列的选定对象导出为CSV

$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

这工作:'$ colItems | Select-Object -Property $ settings_array | export-csv“$ ScriptDir \ Exports \ $ Outputfile”-NoType“在建立了相同功能的数组之后。在单独的函数中构建$ settings_array创建错误。 – Thomas 2013-03-08 16:25:18

回答

1

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

您的样本缺少信息,例如。如何建立$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 
+0

感谢您的回复......当我回去工作时我会尝试这个。 $ settings_array是建立通过类似于 的foreach($在$ chklistbox.SelectedItems项目) $ settings_array + = $项目 我不记得确切的语法循环执行的权利,但它是一个字符串数组。 – Thomas 2013-02-28 01:40:24

+0

我试过这个解决方案,但我得到这个: Select-Object:无法将System.Management.Automation.PSObject转换为以下类型{System.String,System.Management.Automation.ScriptBlock}中的一个 。 在E:\ Scripts \ CSTools \ CSTools。ps1:713 char:56 + $ colItems |选择对象<<<< - 属性$ sett ings_array |出口CSV “$ SCRIPTDIR \出口\ $ OUTPUTFILE” + CategoryInfo:InvalidArgument:(:) [选择-对象],NotSupport edException + FullyQualifiedErrorId:DictionaryKeyUnknownType,Microsoft.PowerShell.Co mmands.SelectObjectCommand – Thomas 2013-02-28 15:30:50

+0

下面是代码为$ settings_array '功能设置(){ Foreach($ objItem在$ chklstGetMIPRet.CheckedItems){$ settings_array1 + = [String] $ objItem}返回$ settings_array1} $ settings_array =设置($ this)' – Thomas 2013-02-28 15:34:03

0

只是simpe提示:您可以在XML导出与出口CLIXML和什么的,他们都在文件中添加的列数。