none
Inhalte aus Ergebnissen herausfiltern RRS feed

  • Frage

  • Hallo,

    ich wollte mir ein kleines Script schreiben, mit dem ich mir die Signalstärke des verbundenen Wlan-Netzwerkes anzeigen lassen kann, aber mein Problem ist, dass ich nur die Zeile angezeigt haben möchte, in der die Siganlstärke angezeigt steht.

    netsh wlan show interfaces

    -->

        Name                   : WLAN
        Beschreibung           : ...
        GUID                   : ...
        Physische Adresse      : ...
        Status                 : Verbunden
        SSID                   : ...
        BSSID                  : ...
        Netzwerktyp            : ...
        Funktyp                   : ...
        Authentifizierung   : ...
        Verschlüsselung        : ...
        Verbindungsmodus          : ...
        Kanal               : ...
        Empfangsrate (MBit/s)  : ...
        Übertragungsrate (MBit/s) : ...
        Signal              : 94%
        Profil                 : ...
    
        Status des gehosteten Netzwerks  : Nicht verfügbar

    Gibt es ein Befehl, um aus den Ergebnissen einzelne Zeilen rauskopieren zu können, wenn man nur einzelne Wörter der Zeile kennt?

    Vielen Dank schon mal im Voraus


    • Bearbeitet Der Anonyme Samstag, 28. September 2019 18:54
    Samstag, 28. September 2019 18:48

Antworten

  • Gibt es ein Befehl, um aus den Ergebnissen einzelne Zeilen rauskopieren zu können, wenn man nur einzelne Wörter der Zeile kennt?

     's gibt mehrere Möglichkeiten. Wenn es immer die gleiche Zeile ist, könntest Du einfach diese rauspicken, z.B. mit Select-Object. Oder Du arbeitest mit Regulären Ausdrücken mittels -match-Operator - da ist die Lernkurve aber etwas steiler. ;-)

    Hast Du denn schon ein Stück Code, den Du zeigen kannst? ... das macht es uns einfacher zu helfen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Der Anonyme Sonntag, 29. September 2019 13:11
    Samstag, 28. September 2019 19:40
  • So wird jede Zeile einzeln nach einem bestimmten Stichwort durchsucht:

    $Textdatei = ".\desktop\Textdatei.txt"
    New-Item $Textdatei -type file
    $measure = Get-Content $Textdatei | Measure-Object
    $lines = $measure.Count
    $Number = 1
    Set-Content $Textdatei -Value (netsh wlan show interfaces)
    
    While ($Number -ne $lines) {
     $Content = ((Get-Content $Textdatei)[$Number])
     if ($Content -contains "Signal"){
      $Zeilenummer = $Number
     }
     $Number = ($Number + 1)
    }
    
    $Signal = ((Get-Content $Textdatei)[$Zeilennummer])
    Write-Host $Signal



    • Als Antwort markiert Der Anonyme Sonntag, 29. September 2019 13:16
    • Bearbeitet Der Anonyme Sonntag, 29. September 2019 13:43
    Sonntag, 29. September 2019 13:15

Alle Antworten

  • Gibt es ein Befehl, um aus den Ergebnissen einzelne Zeilen rauskopieren zu können, wenn man nur einzelne Wörter der Zeile kennt?

     's gibt mehrere Möglichkeiten. Wenn es immer die gleiche Zeile ist, könntest Du einfach diese rauspicken, z.B. mit Select-Object. Oder Du arbeitest mit Regulären Ausdrücken mittels -match-Operator - da ist die Lernkurve aber etwas steiler. ;-)

    Hast Du denn schon ein Stück Code, den Du zeigen kannst? ... das macht es uns einfacher zu helfen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Der Anonyme Sonntag, 29. September 2019 13:11
    Samstag, 28. September 2019 19:40
  • Danke für die Mühe, aber ich habe in der Zwischenzeit eine weitere Lösung gefunden:

    Ich habe mit "Set-Content" das Ergebnis in eine Textdatei exportiert und anschließen mit "(Get-Content $Textdatei) [$Zeilennummer]" die Zeile in eine Variable kopiert, die ich anschließend weiter verwenden konnte.

    $Textdatei = ".\desktop\Textdatei.txt"
    New-Item $Textdatei -type file
    $Zeilennummer = 18 # 19 - 1
    Set-Content $Textdatei -Value (netsh wlan show interfaces)
    $Signal= ((Get-Content $Textdatei)[$Zeilennummer])
    Write-Host $Signal

    Wie kann man mit "Select-Objekt" diese Zeile rauskopieren, wenn ich die Zeilennummer nicht kenne und ich nur weiß, dass das Wort "Signal" in dieser Zeile steht?



    • Bearbeitet Der Anonyme Sonntag, 29. September 2019 13:12
    Sonntag, 29. September 2019 12:41
  • So wird jede Zeile einzeln nach einem bestimmten Stichwort durchsucht:

    $Textdatei = ".\desktop\Textdatei.txt"
    New-Item $Textdatei -type file
    $measure = Get-Content $Textdatei | Measure-Object
    $lines = $measure.Count
    $Number = 1
    Set-Content $Textdatei -Value (netsh wlan show interfaces)
    
    While ($Number -ne $lines) {
     $Content = ((Get-Content $Textdatei)[$Number])
     if ($Content -contains "Signal"){
      $Zeilenummer = $Number
     }
     $Number = ($Number + 1)
    }
    
    $Signal = ((Get-Content $Textdatei)[$Zeilennummer])
    Write-Host $Signal



    • Als Antwort markiert Der Anonyme Sonntag, 29. September 2019 13:16
    • Bearbeitet Der Anonyme Sonntag, 29. September 2019 13:43
    Sonntag, 29. September 2019 13:15
  • Hey hey ... ich bin stolz auf Dich ... ;-)

    Du brauchst das Ganze aber nicht zwingend in eine Datei schreiben. Wenn Du wirklich einfach die ganze Zeile ausgeben möchtest, kannst Du den Output von Netsh einfach an ein Select-Object weiterleiten und Dir die 19. Zeile "rauspicken"

    $NetshOutput = netsh wlan show interfaces 
    $NetshOutput |
        Select-Object -Skip 18 -First 1

    Ich hab das jetzt nur mal in eine Variable zwischengespeichert, um noch weiter damit arbeiten zu können. ;-)  ... das kann man auch weglassen.

    Wir können den Output von Netsh aber auch nach dieser speziellen Zeile filtern ... mit einem Where-Object und einem Vergleichs-Operator (hier -match). Der gibt dann auch direkt die ganze Zeile aus:

    $NetshOutput |
        Where-Object { $_ -match 'Signal' }

    Soweit so einfach. Powershell kann aber mehr. Wenn Du z.B. nur die Zahl ausgeben möchtest, um sie vergleichen zu können, kannst Du Dir die Eigenschaft von -match zunutze machen, dass gefundene Treffer in einer automatischen Variable Namens $Matches gespeichert werden. Wenn Du das Pattern (Muster) entsprechend anpasst, ist darin auch nur die Zahl (vorerst als String) enthalten:

    $NetshOutput | 
        Where-Object { [VOID]$($_ -match '(?<=Signal\s+:\s+)\d+') }
    $Matches[0]

    Um jetzt Deine Frage noch zu beantworten, speichern wir den Netseh-Output einfach nochmal in einer Datei:

    $NetshOutput |
        Out-File D:\sample\netsh.log
    Select-String -Path D:\sample\netsh.log -Pattern '(?<=Signal\s+:\s+)\d+' |
        Select-Object -Property *

    Man kann Select-String sowohl einen Dateipfad als auch ein Suchmuster mitgeben. Mit diesem Befehl lassen wir uns erstmal ALLE zurückgelieferten Properties ausgeben und schauen, welche uns eventuell weiterhilft. Leinnumber und Line könnten da passen ... aber da ist noch so eine mysteriöse Property Matches  ... wir schauen mal das da drin ist:

    Select-String -Path D:\sample\netsh.log -Pattern '(?<=Signal\s+:\s+)\d+' |
        Select-Object -ExpandProperty Matches

    ... da taucht ja auch unser Wert auf. Dann extrahieren wir den auch noch:

    Select-String -Path D:\sample\netsh.log -Pattern '(?<=Signal\s+:\s+)\d+' |
        Select-Object -ExpandProperty Matches |
            Select-Object -ExpandProperty Value

    Voilá ... da wären wir ... ;-)

    (Wegen der besseren Lesbarkeit, fügt man nach dem Pipe-Symbol "|" einen Zeilenumbruch ein. Solche Zeilen gehören zusammen und müssen dann in der Powershell_ISE oder in VSCode gemeinsam markiert und mit <F8> ausgeführt werden)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Sonntag, 29. September 2019 14:22
    Sonntag, 29. September 2019 13:57