2013-02-27 77 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和什麼的,他們都在文件中添加的列數。

相關問題