web-dev-qa-db-fra.com

Comment exporter des données au format CSV dans PowerShell?

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\"
    }
}

Je veux exporter Write-Host "\ $ computer\$ DESTINATION \" vers les fichiers CSV pour que je sache quels ordinateurs étaient hors connexion lors de l'exécution du script.

J'exécute ceci à partir d'une machine Windows 7

18
software is fun

Cette solution crée un psobject et ajoute chaque objet à un tableau, puis crée le csv en dirigeant le contenu du tableau par 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

Si vous dirigez un objet string vers un csv, sa longueur sera écrite dans le csv, car il s'agit des propriétés de la chaîne. Voir ici pour plus d'informations.

C'est pourquoi je crée d'abord un nouvel objet.

Essayez ce qui suit:

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

Cela vous donnera:

"Length"
"4"

Si vous utilisez Get-Member en écriture-sortie comme suit:

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

Vous verrez qu'il a une propriété - 'length':

   TypeName: System.String

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

C'est pourquoi Longueur sera écrit dans le fichier csv.


Mise à jour: ajout d'un fichier CSV Ce n'est pas la méthode la plus efficace si le fichier est volumineux ...

$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

utilisez simplement le cmd Out-File mais n'oubliez pas de donner un type d'encodage: -Encoding UTF8

alors utilisez-le donc:

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

-Append est requis si vous souhaitez écrire plusieurs fois dans le fichier.

4
user3460304

ce que vous recherchez est le Export-Csv file.csv

essayez d'utiliser Get-Help Export-Csv pour voir ce qui est possible

également Out-File -FilePath "file.csv" marchera

2
RayofCommand

Vous pouvez toujours utiliser le

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

Vous devrez insérer "` t "entre les colonnes pour séparer les variables dans leur propre colonne. Voici comment j'ai écrit mon 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)

}

C'est le moyen le plus simple pour moi. Le résultat obtenu est:

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

Vous pouvez jouer avec le look, mais c'est l'idée de base. Le compte $ est juste une barre de progression si vous voulez pimenter le look

1
Harry Singh