如何在PowerShell中将数据导出到CSV?

时间:2014-01-10 14:45:10

标签: powershell powershell-v2.0

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计算机上运行的

4 个答案:

答案 0 :(得分:27)

此解决方案创建一个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

你会看到它有一个属性 - 'length':

   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

答案 1 :(得分:4)

只需使用Out-File cmd但不要忘记给出一种编码类型:  -Encoding UTF8

所以请使用它:

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

如果您想多次写入文件,则需要-Append。

答案 2 :(得分:2)

您要搜索的是Export-Csv file.csv

尝试使用Get-Help Export-Csv来查看可能的内容

Out-File -FilePath "file.csv"也可以

答案 3 :(得分:1)

您可以随时使用

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只是一个进度条,如果你想增加外观