2012-02-09 34 views
6

Tôi có một kịch bản như sau:Powershell - Xuất CSV và Nối

$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 
} 
} 

Tuy nhiên, tôi không thể có được nó để đầu ra tất cả các kết quả cho $ out_file vì nó dường như không để thêm dữ liệu vào tệp csv. Tôi đã thử một số thứ, ý tưởng và đề xuất được tìm thấy trực tuyến. Không ai trong số họ dường như làm việc và tôi cảm thấy như tôi đang thiếu một cái gì đó khá dễ dàng ở đây. Có cách nào để làm cho điều này gắn thêm dữ liệu vào một tập tin? Nếu vậy, bạn có thể cung cấp một ví dụ hoặc một đoạn mã để làm cho nó hoạt động theo cách đó không? Tôi không yêu cầu viết lại tất cả các mã hoặc bất kỳ thứ gì dọc theo các dòng đó, chỉ là một cách để làm cho dữ liệu đang được xuất khẩu được thêm vào tệp được xuất.

Trả lời

9

Chuyển đổi vòng lặp foreach thành đối tượng foreach và di chuyển export-csv sang bên ngoài đối tượng foreach để bạn có thể chuyển tất cả các đối tượng sang export-csv.

Something như thế này (chưa được kiểm tra):

$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

Ra khỏi tò mò, làm thế nào thực hiện điều này thay đổi quá trình xử lý để cho phép này để làm việc? Tại sao tôi muốn sử dụng một ForEach-Object thay vì một ForEach? – John

+0

bởi vì bạn có thể kết hợp tất cả chúng lại với nhau thay vì tiết kiệm cho mỗi bộ trong số chúng – manojlds

4

-Nối được chia trong Powershell v2.0 Sử dụng Dmitry Sotikovs workaound: http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

Tôi tuy nhiên muốn giới thiệu manojlds giải pháp tuyệt vời!

+2

Không có -Đăng ký cho Xuất-CSV trong PSv2. Mặc dù liên kết tốt đẹp. Ví dụ tốt về thời điểm tạo proxy cmdlet. –

3

Như Sune đã đề cập, xuất khẩu Csv của PowerShell v3 có cờ Phụ thêm nhưng không có bảo vệ mã hóa ký tự. manojlds là chính xác, vì mã của bạn đang ghi tất cả dữ liệu mới vào tệp CSV mới.

Trong khi đó, bạn có thể nối thêm dữ liệu vào một CSV bằng cách:

  1. Chuyển đổi các đối tượng để CSV với ConvertTo-Csv
  2. Strip header -Và gõ thông tin nếu necessary- và thu thập các CSV chỉ dữ liệu
  3. Nối dữ liệu CSV mới vào tệp CSV thông qua Add-Content hoặc Out-File, hãy đảm bảo sử dụng cùng một mã hóa ký tự

Đây là một mẫu:

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

Sau khi phiên bản 3, bạn có thể sử dụng:

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