2012-02-09 37 views
6

我有一個腳本,如下列:PowerShell的 - 出口,CSV和追加

$in_file = "C:\Data\Need-Info.csv" 
$out_file = "C:\Data\Need-Info_Updated.csv" 
$list = Import-Csv $in_file 
ForEach ($user in $list) { 
$zID = $user.zID 
ForEach-Object { Get-QADUser -Service 'domain.local' -SearchRoot 'OU=Users,DC=domain,DC=local' -SizeLimit 75000 -LdapFilter "(&(objectCategory=person)(objectClass=user)(PersonzID=$zID))" | 
Select-Object DisplayName,samAccountName,@{Name="zID";expression={$zID}} | 
Export-Csv $out_file -NoTypeInformation -Force 
} 
} 

但是,我無法得到它的輸出所有結果到$ out_file,因爲它似乎沒有將數據追加到csv文件。我嘗試了許多在網上找到的東西,想法和建議。他們似乎都沒有工作,我覺得我錯過了一些相當容易的事情。有沒有辦法讓這個數據追加到一個文件?如果是這樣,你能提供一個例子或代碼片段,使其以這種方式工作嗎?我並不是要求重寫所有代碼或任何沿着這些代碼的東西,只是一種將輸出中的數據附加到輸出文件的方法。

回答

9

將foreach循環轉換爲一個foreach對象,並將export-csv移動到outter foreach對象的外部,這樣您就可以將所有對象管道輸出到export-csv。

像這樣(未經):

$list | ForEach { 
$zID = $_.zID 
ForEach-Object { Get-QADUser -Service 'domain.local' -SearchRoot 'OU=Users,DC=domain,DC=local' -SizeLimit 75000 -LdapFilter "(&(objectCategory=person)(objectClass=user)(PersonzID=$zID))" | 
Select-Object DisplayName,samAccountName,@{Name="zID";expression={$zID}} | 

} 
} |Export-Csv $out_file -NoTypeInformation -Force 
+0

出於好奇,請問如何改變處理,使這項工作?爲什麼我要使用ForEach對象而不是ForEach? – John 2012-02-09 23:33:15

+0

,因爲您可以將它們全部彙集在一起​​而不是爲每組彙總保存 – manojlds 2012-02-09 23:34:37

3

正如Sune所說,PowerShell v3的Export-Csv有一個Append標誌,但是沒有字符編碼保護。 manojlds是正確的,因爲您的代碼正在將所有新數據寫入新的CSV文件。

同時,你可以通過數據追加到一個CSV:

  1. 轉換對象以CSV用的ConvertTo-CSV
  2. 地帶頭-and如果鍵入的信息necessary-和收集 CSV數據只有
  3. 新的CSV數據追加到CSV文件通過添加內容或 出文件,一定要使用相同的字符編碼

這裏有一個例子:

1..3 | ForEach-Object { 
New-Object PSObject -Property @{Number = $_; Cubed = $_ * $_ * $_} 
} | Export-Csv -Path .\NumTest.csv -NoTypeInformation -Encoding UTF8 

# create new data 
$newData = 4..5 | ForEach-Object { 
New-Object PSObject -Property @{Number = $_; Cubed = $_ * $_ * $_} 
} | ConvertTo-Csv -NoTypeInformation 

# strip header (1st element) by assigning it to Null and collect new data 
$null, $justData = $newData 

# append just the new data 
Add-Content -Path .\NumTest.csv -Value $justData -Encoding UTF8 

# create more new data, strip header and collect just data 
$null, $data = 6..9 | ForEach-Object { 
New-Object PSObject -Property @{Number = $_; Cubed = $_ * $_ * $_} 
} | ConvertTo-Csv -NoTypeInformation 

# append the new data 
Add-Content -Path .\NumTest.csv -Value $data -Encoding UTF8 

# verify 
Import-Csv .\NumTest.csv 

# clean up 
Remove-Item .\NumTest.csv 
0

3版本後,可以使用:

Export-Csv $out_file -append -notypeinformation -encoding "unicode"