web-dev-qa-db-ja.com

PowerShellでデータをCSVにエクスポートする方法は?

foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {
        Write-Host "\\$computer\$DESTINATION\"
    }
}

Write-Host "\ $ computer\$ DESTINATION \"をCSVファイルにエクスポートしたいので、スクリプトの実行時にどのコンピューターがオフラインであったかがわかります。

これをWindows 7マシンから実行しています

18
software is fun

このソリューションでは、psobjectを作成し、各オブジェクトを配列に追加し、Export-CSVを介して配列のコンテンツをパイプ処理することによりcsvを作成します。

$results = @()
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {

        $details = @{            
                Date             = get-date              
                ComputerName     = $Computer                 
                Destination      = $Destination 
        }                           
        $results += New-Object PSObject -Property $details  
    }
}
$results | export-csv -Path c:\temp\so.csv -NoTypeInformation

文字列オブジェクトをcsvにパイプすると、その長さがcsvに書き込まれます。これは、これらが文字列のプロパティであるためです。詳細については、 here を参照してください。

これが、最初に新しいオブジェクトを作成する理由です。

以下を試してください:

write-output "test" | convertto-csv -NoTypeInformation

これにより、以下が得られます。

"Length"
"4"

次のように書き込み出力でGet-Memberを使用する場合:

write-output "test" | Get-Member -MemberType Property

プロパティには「長さ」というプロパティが1つあることがわかります。

   TypeName: System.String

Name   MemberType Definition
----   ---------- ----------
Length Property   System.Int32 Length {get;}

これが、Lengthがcsvファイルに書き込まれる理由です。


更新:CSVの追加ファイルが大きくなった場合、最も効率的な方法ではありません...

$csvFileName = "c:\temp\so.csv"
$results = @()
if (Test-Path $csvFileName)
{
    $results += Import-Csv -Path $csvFileName
}
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {

        $details = @{            
                Date             = get-date              
                ComputerName     = $Computer                 
                Destination      = $Destination 
        }                           
        $results += New-Object PSObject -Property $details  
    }
}
$results | export-csv -Path $csvFileName -NoTypeInformation
31
David Martin

単にOut-Fileコマンドを使用しますが、エンコードタイプ-Encoding UTF8を指定することを忘れないでください

だからそれを使用します:

$log | Out-File -Append C:\as\whatever.csv -Encoding UTF8

-ファイルに複数回書き込む場合は、追加が必要です。

4
user3460304

あなたが探しているのはExport-Csv file.csvです

get-Help Export-Csvを使用して、可能なことを確認してください。

Out-File -FilePath "file.csv"も機能します

2
RayofCommand

いつでも使用できます

echo "Column1`tColumn2`tColumn3..." >> results.csv

変数を独自の列に分離するには、列の間に「 `t」を挿入する必要があります。スクリプトの作成方法は次のとおりです。

echo "Host`tState" >> results.csv
$names = Get-Content "hostlist.txt"
foreach ($name in $names) {
    $count = 0
    $count2 = 13490

    if ( Test-Connection -ComputerName $name -Count 1 -ErrorAction SilentlyContinue ) {
        echo "$name`tUp" >> results.csv
    }
    else {
        echo "$name`tDown" >> results.csv
    }

    $count++
    Write-Progress -Activity "Gathering Information" -status "Pinging Hosts..." -percentComplete ($count / $count2 *100)

}

これが私にとって最も簡単な方法です。私が得る出力は次のとおりです。

Host|State
----------
H1  |Up
H2  |UP
H3  |Down

見た目をいじることができますが、それが基本的な考え方です。 $ countは、見栄えを良くしたい場合の単なる進行状況バーです

1
Harry Singh