Powershell export saubere Formatierung
Hallo an alle,
ich hätte man (wieder) eine Frage zu Powershell.
Ich möchte ein Script schreiben welches eine (oder mehrere) Netzwerkadressen pingt und mir die Daten in eine Excel Datei schreibt.
Das funktioniert auch mit Export-CSV aber die Formatierung ist nicht richtig. Es schreibt alles ziemlich unübersichtlich in eine Spalte.
Wie kann ich die Daten sauber in eine Excel Datei schreiben lassen?
So dass die Adresse und Time(ms) jeweils in eine separate Spalte geschrieben werden?
Oder kennt hier jemand vielleicht schon ein fertiges Script von welchem ich mir das wichtigste holen kann?
Und noch eine Frage.. Mit PS5 kann man, was Netzwerktests angeht, ja einiges mehr anstellen als mit PS4.
Ist es möglich dass ich PS5 auch auf meinem Win7 installieren kann?
Hab gelesen man muss Windows Management Framework 5 installieren aber das lässt sich bei mir nicht installieren.
Danke schon mal für eure Hilfe!!
LG Simon
ich hätte man (wieder) eine Frage zu Powershell.
Ich möchte ein Script schreiben welches eine (oder mehrere) Netzwerkadressen pingt und mir die Daten in eine Excel Datei schreibt.
Das funktioniert auch mit Export-CSV aber die Formatierung ist nicht richtig. Es schreibt alles ziemlich unübersichtlich in eine Spalte.
Wie kann ich die Daten sauber in eine Excel Datei schreiben lassen?
So dass die Adresse und Time(ms) jeweils in eine separate Spalte geschrieben werden?
Oder kennt hier jemand vielleicht schon ein fertiges Script von welchem ich mir das wichtigste holen kann?
Und noch eine Frage.. Mit PS5 kann man, was Netzwerktests angeht, ja einiges mehr anstellen als mit PS4.
Ist es möglich dass ich PS5 auch auf meinem Win7 installieren kann?
Hab gelesen man muss Windows Management Framework 5 installieren aber das lässt sich bei mir nicht installieren.
Danke schon mal für eure Hilfe!!
LG Simon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 316060
Url: https://administrator.de/contentid/316060
Ausgedruckt am: 25.11.2024 um 11:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Simon,
https://www.microsoft.com/en-us/download/details.aspx?id=50395
Brauchst du aber nicht unbedingt um mehr im Netzwerk zu machen .
Um z.B. einen ganzen Network-Range "abzupingen" kann du z.B . das Script hier nehmen:
Als myping.ps1 speichern und dann so in der PS Konsole aufrufen um ein Subnetz abzuarbeiten:
Das Egebnis kannst du auch gleich an Export-CSV pipen
Das war jetzt ein einfaches Beispiel. Die Umsetzung erfolgt hier explizit nicht mit Test-Computer das es einfach zu langsam ist wenn eine IP nicht reagiert, deswegen die Umsetzung über "Networkinformation.Ping".
Man kann das ganze auch noch wesentlich beschleunigen indem man parallel pingen lässt, das geht z.B. mit einem PS-Workflow sehr effizient.
Beispiel eines PS Workflows funktioniert erst ab PS. 3.0
Die Ergebnisse sind alles Objekte, lassen sich also einfach direkt an Export-CSV übergeben.
So ich denke jetzt hast du ausreichend Input für dein Vorhaben.
Grüße Uwe
$data = @()
$data += [pscustomobject] @{'Host'='192.168.1.20';'ResponseTime' = '10ms'}
$data | export-csv 'C:\Pfad.csv' -delimiter ";" -NoType -Encoding UTF8
Ist es möglich dass ich PS5 auch auf meinem Win7 installieren kann?
Ja. WIN7 SP1 ist in den Specs.https://www.microsoft.com/en-us/download/details.aspx?id=50395
Brauchst du aber nicht unbedingt um mehr im Netzwerk zu machen .
Um z.B. einen ganzen Network-Range "abzupingen" kann du z.B . das Script hier nehmen:
Als myping.ps1 speichern und dann so in der PS Konsole aufrufen um ein Subnetz abzuarbeiten:
.\myping.ps1 "192.168.1.0/24" -ttl 200
.\myping.ps1 "192.168.1.0/24" -ttl 200 | export-csv '.\ergebnis.csv' -delimiter ";" -NoType -Encoding UTF8
param(
[parameter(mandatory=$true)][ValidateScript({$_ -match '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/([1-2][0-9]|3[0-2]|[0-9])'})][string]$net,
[parameter(mandatory=$false)][int]$ttl = 500
)
function Get-NetworkRange {
param(
[parameter(mandatory=$true)][String]$IP,
[parameter(mandatory=$true)][String]$Mask
)
try{
if (!$Mask.Contains('.')) {
$Mask = [Convert]::ToUInt32((("1" * $Mask).PadRight(32, "0")), 2)
}
$toDecimalIP = {
param([Net.IPAddress]$ip)
$i = 3; $decip = 0;
$ip.GetAddressBytes() | %{ $decip += $_ * [Math]::Pow(256, $i); $i-- }
return [UInt32]$decip
}
$dIP = & $toDecimalIP $IP
$dMask = & $toDecimalIP $Mask
$Network = $dIP -band $dMask
$Broadcast = $dIP -bor ((-bnot $dMask) -band [UInt32]::MaxValue)
for ($i = $($Network + 1); $i -lt $Broadcast; $i++){
$ipa = [UInt32]$i
[String]::Join('.', $(for ($j = 3; $j -gt -1; $j--) {
$Remainder = $ipa % [Math]::Pow(256, $j)
($ipa - $Remainder) / [Math]::Pow(256, $j)
$ipa = $Remainder
}))
}
}catch{
Write-Error $_.Exception.Message
}
}
function Send-Ping([string]$device,[int]$delay){
try{
$s = $ping.Send($device,$delay)
if($s.Status -ne "Success"){
return $false
}else{
return $s
}
}catch{return $false}
}
$ping = New-Object System.Net.NetworkInformation.Ping
$t = $net.Split('/');$network = $t;$netmask = $t[1]
$obj = @()
$hosts = Get-NetworkRange $network $netmask
$pos = 0; $ct = get-date
$hosts | %{
$pingresult = Send-Ping $_ $ttl
$obj += [pscustomobject] @{IP=$_;Status=$(if($pingresult){"Online"}else{"Offline"});"ResponseTime" = $(if($pingresult){$pingresult.RoundTripTime}else{""})}
Write-Progress -Activity "Checking Network" -Status "Checking Host $_" -PercentComplete (($pos / $hosts.Length) * 100) -SecondsRemaining ([int](((get-date) - $ct).TotalSeconds * ($hosts.Length - $pos)))
$ct = get-date
$pos++
}
return $obj
Das war jetzt ein einfaches Beispiel. Die Umsetzung erfolgt hier explizit nicht mit Test-Computer das es einfach zu langsam ist wenn eine IP nicht reagiert, deswegen die Umsetzung über "Networkinformation.Ping".
Man kann das ganze auch noch wesentlich beschleunigen indem man parallel pingen lässt, das geht z.B. mit einem PS-Workflow sehr effizient.
Beispiel eines PS Workflows funktioniert erst ab PS. 3.0
workflow Fast-PingComputers {
param(
[parameter(mandatory=$true)][string[]]$computers,
[parameter(mandatory=$false)][int]$timeout = 500,
[parameter(mandatory=$false)][int]$throttlelimit = 5
)
function Send-Ping {
param([string]$device,[int]$delay)
$ping = New-Object System.Net.NetworkInformation.Ping
if($ping.Send($device,$delay).Status -ne "Success"){
return $false
}else{
return $true
}
}
foreach -parallel -throttle $throttlelimit ($c in $computers){
$status = Send-Ping $c $timeout
[pscustomobject]@{Name=$c;PingStatus=$status}
}
}
$comp = 1..30 | %{"192.168.1.$_"}
Fast-PingComputers $comp -timeout 10 -throttlelimit 5 | select Name,PingStatus
So ich denke jetzt hast du ausreichend Input für dein Vorhaben.
Grüße Uwe
Zitat von @zamsi7:
Leider lässt sich das WMF nicht bei mir installieren. Wird schon an meinem Rechner liegen ^^
Ohne Fehlermeldungen und Logs von deiner Seite können wir hier ja nicht viel diagnostizieren das sollte dir eigentlich klar sein Leider lässt sich das WMF nicht bei mir installieren. Wird schon an meinem Rechner liegen ^^
Das MF 4.0 reicht aber vollkommen für dein Vorhaben solange du keine Klassen oder sonstige Spezialitäten brauchst!
Danke!! und schönes Wochenende!
Wünsche ich ebenso