How to export data to CSV in PowerShell?

后端 未结 4 1620
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-03 03:03
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
               


        
相关标签:
4条回答
  • 2020-12-03 03:31

    simply use the Out-File cmd but DON'T forget to give an encoding type: -Encoding UTF8

    so use it so:

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

    -Append is required if you want to write in the file more then once.

    0 讨论(0)
  • 2020-12-03 03:33

    You can always use the

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

    You will need to put "`t" between the columns to separates the variables into their own column. Here is the way I wrote my script:

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

    This is the easiest way to me. The output I get is :

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

    You can play around with the look, but that's the basic idea. The $count is just a progress bar if you want to spice up the look

    0 讨论(0)
  • 2020-12-03 03:34

    what you are searching for is the Export-Csv file.csv

    try using Get-Help Export-Csv to see whats possible

    also Out-File -FilePath "file.csv" will work

    0 讨论(0)
  • 2020-12-03 03:41

    This solution creates a psobject and adds each object to an array, it then creates the csv by piping the contents of the array through Export-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
    

    If you pipe a string object to a csv you will get its length written to the csv, this is because these are properties of the string, See here for more information.

    This is why I create a new object first.

    Try the following:

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

    This will give you:

    "Length"
    "4"
    

    If you use the Get-Member on Write-Output as follows:

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

    You will see that it has one property - 'length':

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

    This is why Length will be written to the csv file.


    Update: Appending a CSV Not the most efficient way if the file gets large...

    $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
    
    0 讨论(0)
提交回复
热议问题