1. ホーム
  2. powershell

[解決済み] PowerShellでデータをCSVにエクスポートする方法は?

2022-03-01 01:36:05

質問

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 マシンで実行しています。

解決方法は?

この解決策は、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 に書き込まれますが、これは文字列のプロパティであるためです。 ここで をご覧ください。

そのため、最初に新しいオブジェクトを作成するのです。

以下を試してみてください。

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

これで得られます。

"Length"
"4"

以下のようにWrite-OutputでGet-Memberを使用した場合。

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

長さ」という1つのプロパティを持っていることがわかります。

   TypeName: System.String

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

このため 長さ が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