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\"
}
}
Ich möchte Write-Host "\ $ computer\$ DESTINATION \" in die CSV-Dateien exportieren, damit ich weiß, welche Computer beim Ausführen des Skripts offline waren.
Ich führe dies von einem Windows 7-Computer aus
Diese Lösung erstellt ein PSObject und fügt jedes Objekt einem Array hinzu. Anschließend wird die CSV erstellt, indem der Inhalt des Arrays über Export-CSV weitergeleitet wird.
$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
Wenn Sie ein String-Objekt an eine CSV weiterleiten, wird dessen Länge in die CSV geschrieben. Dies liegt daran, dass dies Eigenschaften des Strings sind. Weitere Informationen finden Sie unter hier .
Deshalb erstelle ich ein neues Objekt.
Versuche Folgendes:
write-output "test" | convertto-csv -NoTypeInformation
Dies gibt Ihnen:
"Length"
"4"
Wenn Sie das Get-Member für Write-Output wie folgt verwenden:
write-output "test" | Get-Member -MemberType Property
Sie werden sehen, dass es eine Eigenschaft gibt - 'length':
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property System.Int32 Length {get;}
Aus diesem Grund wird Länge in die CSV-Datei geschrieben.
Update: Anhängen einer CSV Nicht die effizienteste Methode, wenn die Datei groß wird ...
$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
verwenden Sie einfach den Befehl Out-File, aber vergessen Sie nicht, einen Codierungstyp anzugeben: -Encoding UTF8
also benutze es so:
$log | Out-File -Append C:\as\whatever.csv -Encoding UTF8
-Anhängen ist erforderlich, wenn Sie die Datei mehrmals schreiben möchten.
was du suchst ist das Export-Csv file.csv
verwenden Sie Get-Help Export-Csv, um zu sehen, was möglich ist
ebenfalls Out-File -FilePath "file.csv"
wird funktionieren
Sie können immer die
echo "Column1`tColumn2`tColumn3..." >> results.csv
Sie müssen "` t "zwischen die Spalten setzen, um die Variablen in ihre eigene Spalte zu trennen. So habe ich mein Drehbuch geschrieben:
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)
}
Das ist der einfachste Weg für mich. Die Ausgabe, die ich erhalte, ist:
Host|State
----------
H1 |Up
H2 |UP
H3 |Down
Sie können mit dem Look herumspielen, aber das ist die Grundidee. Das $ count ist nur ein Fortschrittsbalken, wenn Sie den Look aufpeppen möchten