zamsi7
Goto Top

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!! face-smile

LG Simon

Content-Key: 316060

Url: https://administrator.de/contentid/316060

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: zamsi7
zamsi7 23.09.2016 um 12:25:33 Uhr
Goto Top
Hab jetzt mal was gefunden. Mit -delimiter ";"
Mitglied: colinardo
colinardo 23.09.2016 aktualisiert um 12:56:31 Uhr
Goto Top
Hallo Simon,
$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 face-smile.


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
Das Egebnis kannst du auch gleich an Export-CSV pipen
.\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
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
Mitglied: zamsi7
zamsi7 23.09.2016 um 14:10:57 Uhr
Goto Top
Vielen vielen Dank Uwe für diese genau Beschreibung.
Werde mich mal durcharbeiten face-smile

Danke!! und schönes Wochenende!
Mitglied: zamsi7
zamsi7 23.09.2016 um 14:13:04 Uhr
Goto Top
Leider lässt sich das WMF nicht bei mir installieren. Wird schon an meinem Rechner liegen ^^
Mitglied: colinardo
colinardo 23.09.2016 aktualisiert um 14:21:41 Uhr
Goto Top
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 face-sad

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 face-smile
Mitglied: zamsi7
zamsi7 07.10.2016 um 10:05:34 Uhr
Goto Top
Danke vielmals für eure Hilfe!!

Habe es, mit eurer Hilfe einigermaßen sauber hinbekommen face-smile

LG Simon