web-dev-qa-db-ja.com

Powershell-Export-CSVおよびAppend

次のようなスクリプトがあります。

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

ただし、csvファイルにデータを追加していないようなので、すべての結果を$ out_fileに出力することはできません。オンラインで見つけた多くのこと、アイデア、提案を試しました。どれも動作していないようで、ここではかなり簡単なものがないように感じます。これにデータをファイルに追加させる方法はありますか?もしそうなら、それをそのように機能させるための例またはコードの断片を提供できますか?エクスポートされるデータを出力されるファイルに追加するための方法であるだけで、すべてのコードやそれらの行に沿った何かの書き換えを求めているのではありません。

9
John

Foreachループをforeach-objectに変換し、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
10
manojlds

-appendがPowershell v2.0で壊れているDmitry Sotikovsの回避策を使用: http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

ただし、manojldsの優れたソリューションをお勧めします。

4
Sune

Suneが述べたように、PowerShell v3のExport-CsvにはAppendフラグがありますが、文字エンコーディング保護なしです。コードがすべての新しいデータを新しいCSVファイルに書き込んでいるため、manojldsは正しいです。

その間、あなたはcan CSVにデータを追加する:

  1. ConvertTo-Csvを使用してオブジェクトをCSVに変換する
  2. ヘッダーを取り除き、必要に応じて情報を入力し、CSVデータのみを収集します
  3. Add-ContentまたはOut-Fileを介して新しい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
3
zx38

バージョン3以降は、次を使用できます。

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