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
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
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.
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
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