CSV aus PS generiert enthält komische Zeichen
Hallo allerseits, ich habe ein Problem mit den Umlauten, es soll ein CSV generiert werden mit IP Daten, und ich habe trotz Verwendung von UTF8 kyyptische Zeichen da wo Umlaute stehen. Wie kann ic hda Abhilfe schafen. Folgendes Scipt:
vielen liebe Dank i.V.
lg
$CSVFilePath = "\\dom...\inv2\Summary_Short.csv"
$ComputersA = Get-ADComputer -Filter "Name -like 'A*'"
$ComputersN = Get-ADComputer -Filter "Name -like 'N*'"
$Computers = $ComputersA + $ComputersN
function ping2 {
param(
[Parameter(Mandatory = $true)]
[array]$Computers,
[int]$TimeOut = 800
)
$Tasks = [System.Collections.Generic.List[Object]]::new()
foreach ($address in $Computers) {
$Tasks.Add([pscustomobject]@{
PC = $address.Name
Timestamp = [DateTimeOffset]::Now.ToUnixTimeMilliseconds()
pingTask = [System.Net.NetworkInformation.Ping]::new().SendPingAsync($address.Name, $TimeOut)
})
}
$Results = foreach ($Task in $Tasks) {
try {
$Task.pingTask.Wait()
$Status = $Task.pingTask.Result.Status
$IPAddress = if ($Task.pingTask.Result.Address) { $Task.pingTask.Result.Address.IPAddressToString } else { "N/A" }
$Latency = $Task.pingTask.Result.RoundTripTime
$Bytes = if ($Task.pingTask.Result.Buffer) { $Task.pingTask.Result.Buffer.Length } else { 0 }
} catch {
$Status = "Error"
$IPAddress = "N/A"
$Latency = 0
$Bytes = 0
}
[pscustomobject]@{
Timestamp = $Task.Timestamp
PC = $Task.PC
Status = $Status
IPAddress = $IPAddress
Latency = $Latency
Bytes = $Bytes
}
}
return $Results
}
function Get-ARPTable {
$arpTable = @{}
$arpOutput = arp -a
$arpOutput | ForEach-Object {
if ($_ -match '^\s*([0-9\.]+)\s+([0-9a-f\-]+)\s+.*$') {
$arpTable[$matches[1]] = $matches[2]
}
}
return $arpTable
}
$PingResults = ping2 -Computers $Computers
$arpTable = Get-ARPTable
$csvData = Import-Csv -Path $CSVFilePath -Delimiter ";" -Encoding UTF8
$PingResults | ForEach-Object {
$description = $null
$macAddress = $null
foreach ($item in $csvData) {
if ($item.Hostname -eq $_.PC) {
$description = $item.Beschreibung
break
}
}
if ($_.IPAddress -ne "N/A" -and $_.IPAddress -ne "0.0.0.0" -and $arpTable.ContainsKey($_.IPAddress)) {
$macAddress = $arpTable[$_.IPAddress]
}
$_ | Add-Member -NotePropertyName "Description" -NotePropertyValue $description
$_ | Add-Member -NotePropertyName "MACAddress" -NotePropertyValue $macAddress
}
$PingResultsFiltered = $PingResults | Where-Object { $_.IPAddress -ne "N/A" -and $_.IPAddress -ne "0.0.0.0" }
$tempFilePath = "C:\Windows\Temp\Computers.csv"
$PingResultsFiltered | Select-Object PC, Status, IPAddress, MACAddress, Description | Export-Csv -Path $tempFilePath -Delimiter ";" -NoTypeInformation -Encoding UTF8
vielen liebe Dank i.V.
lg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 41275106009
Url: https://administrator.de/contentid/41275106009
Ausgedruckt am: 24.11.2024 um 02:11 Uhr
16 Kommentare
Neuester Kommentar
Thema kommt hier immer wieder mal. Skript unter Windows selbst als UTF-8 mit BOM (Byte Order Mark) speichern, dann klappts auch mit den Umlauten zuverlässig.
Powershell System.Xml.XmlDocument Umlaute
Powershell Variable wird mit falschem Encoding ausgegeben
Powershell, PS2EXE Umlaute falsch angezeigt
Gruß
Powershell System.Xml.XmlDocument Umlaute
Powershell Variable wird mit falschem Encoding ausgegeben
Powershell, PS2EXE Umlaute falsch angezeigt
$arpOutput = arp -a
Des weiteren führst du hier einen Dos Befehl aus, deren Output ist per Default Codepage 850, diesen output musst du erst konvertieren. Ist hier aber jetzt nicht relevant da du nur die MAC daraus verwendest wo keine Umlaute vorkommen könnenfunction Convert-CP850([string[]]$string){
$cp850 = [System.Text.Encoding]::GetEncoding(850)
$string | %{$cp850.GetString([System.Console]::OutputEncoding.GetBytes($_))}
}
$arpOutput = Convert-CP850 (arp -a)
norepad? 🙃
Dann ist deine Quell-CSV wohl schon kein echtes UTF8 sondern bspw. ANSI, dies dann beim Import mittels "Default" Encoding angeben
unter utf mit BOM gespeichert habe aber immer noch zB statt ö diese kleinen Fragezeichen,
Wo?Dann ist deine Quell-CSV wohl schon kein echtes UTF8 sondern bspw. ANSI, dies dann beim Import mittels "Default" Encoding angeben
$csvData = Import-Csv -Path $CSVFilePath -Delimiter ";" -Encoding Default
ich habe noch 16 BE BOM und 16 LE BOM wär das besser?
Macht für Umlaute keinen Unterschied.
Dann die Datei wohl doch noch ein anderes Encoding ... Ermittle es gib es an oder konvertiere die Datei und dann lüppt das auch.
$computers = Get-ADComputer -Filter "Name -like 'A*' -or Name -like 'N*'"
$tasks = foreach($computer in $computers){
[pscustomobject]@{
Name = $computer.Name
Task = [System.Net.NetworkInformation.Ping]::new().SendPingAsync($computer.Name,800,[byte[]]0)
}
}
[System.Threading.Tasks.Task]::WaitAll($tasks.Task)
$result = $tasks | ?{$_.Task.Result.Status -eq 'Success'} | Select Name,@{n='Address';e={$_.Task.Result.Address}},@{n='Result';e={"Online"}}
$result
Haben deine Rechner keine FQDNs? Habe die Property mal explizit hinzugefügt, aber normalerweise ist die beim Default Output von Get-ADComputer immer mit dabei. Ansonsten halt mit Name pingen, ist aber nicht so schön.
Klappt hier einwandfrei ...
Meins gibt nur die Rechner aus die Online sind.
wie man sieht sind immer noch doppelte IP vorhanden
Timestamp PC Status IPAddress MACAddress
1718885922190 N181114 Success 192.168.100.102 84-3a-5b-57-e1-98
1718885922188 N181129 Success 192.168.100.102 84-3a-5b-57-e1-98
Das ist dein Skript nicht meins.Timestamp PC Status IPAddress MACAddress
1718885922190 N181114 Success 192.168.100.102 84-3a-5b-57-e1-98
1718885922188 N181129 Success 192.168.100.102 84-3a-5b-57-e1-98
Meins gibt nur die Rechner aus die Online sind.