9

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

$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 に出力することはできません。

これをファイルにデータを追加する方法はありますか?

4

4 に答える 4

10

foreach ループを foreach-object に変換し、export-csv を外側の 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
于 2012-02-09T23:15:43.833 に答える
4

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

一方、 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
于 2012-02-10T04:50:57.400 に答える
4

-appendPowerShell v2.0 では壊れています。代わりに Dmitry Sotikovs の回避策を使用できます: http://dmitrysotnikov.wordpress.com/2010/01/19/export-csv-append/

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

于 2012-02-09T23:41:35.563 に答える