Windows cmd / batch: findstr einschließen UND ausschließen

tomm1984

Lt. Junior Grade
Registriert
Juni 2016
Beiträge
352
Geschätzes Forum.

In Anlehnung / Erweiterung an: https://www.computerbase.de/forum/t...windows-automatisieren-und-auswerten.1920618/

Ziel: Ich möchte den aktuellen Netzwerk-Namen (fürs Erste reicht WLAN-SSID und ich gehe erstmal nur von einer Verbindung aus) in einer Variablen haben.

Dafür habe ich Folgendes, Vielvesprechendes gefunden: https://stackoverflow.com/questions...currently-connected-wireless-network-in-batch

Mein Code sieht bisher so aus:
Code:
for /f "delims=: tokens=2" %%n in ('netsh wlan show interface name="Wi-Fi" ^| findstr "SSID"') do set "Network=%%n"


pause


SET networkname="%Network:~1%"
ECHO networkname: %networkname%


pause

und liefert:
1709262953967.png


Ich vermute es hat damit zu tun, dass es auch die "BSSID" gibt.
Wenn ich netsh wlan show interface name="Wi-Fi" in cmd abfeuere, dann bekomme ich nämlich:
1709263127842.png


Daraufhin habe ich versucht, den o.g. Code um /v "BSSID" in verschiedenen Varianten anzupassen, aber erhalte nicht das gewünschte Ergebnis.
1709263250417.png


Keine Ahnung, wie ich das schreiben muss und deshalb freue ich mich, wenn mir hier jemand helfen kann ;).
Besten Dank.
 
Kann es gerade nicht sauber testen, aber versuche mal, zwei Suchen hintereinander zu schalten. Alternativ evtl. mit Regex (kann findstr auch)
Code:
findstr /C:"eine Zeile" .\someDoc.txt | findstr /V /C:"keine Zeile"
 
  • Gefällt mir
Reaktionen: Raijin
Könntest du nicht einfach nach dem kompletten String inklusive Doppelpunkt, also SSID : suchen? Die SSID hat immerhin ein Leerzeichen mehr drin als die BSSID. Damit wäre der String eindeutig?!

Ja, keine schöne Lösung, aber einfach.
 
Braucht zwei findstr hintereinander, eins für gesucht und eins für den Ausschluß, läßt sich nicht in einem machen.
Code:
for /f "delims=: tokens=2" %%n in ('netsh wlan show interface name="Wi-Fi" ^| findstr "SSID" ^| findstr /v "BSSID"') do set "Network=%%n"
 
Wahrscheinlich würde schon ein banales Leerzeichen ausreichen: findstr " SSID"
 
  • Gefällt mir
Reaktionen: madmax2010
Findstr ist zickig, wenn man mehrere Parameter verwenden will, läßt sich in der Pipe aber 'stapeln', einfach mehrere findstr-Pipes hintereinander nutzen. Umwege mit Leerzeichen sind nicht immer gut.
 
  • Gefällt mir
Reaktionen: tomm1984
Mit Powershell ganz einfach :)
Code:
$ssid = (Get-NetConnectionProfile).Name
 
  • Gefällt mir
Reaktionen: kamanu, 0x8100, Raijin und 2 andere
PowerShell ist natürlich grundsätzlich deutlich besser für Scripting geeignet als Batch und es gibt nur wenige Gründe, die gegen PowerShell sprechen. Der Hauptgrund für mich persönlich ist dabei recht simpel: Ich bin mit Batch aufgewachsen und ein Nostalgiker - obwohl ich weiß, dass Batch manchmal ne echte Bitch sein kann.

Inwiefern es praktikabel ist, ein bestehendes Batch-Script auf PowerShell umzubauen, hängt vom Umfang des Scripts und dessen Aufgabe ab. Ein Großteil der Arbeit fokussiert sich bei Batch auf das Parsen von stdout oder stderr, was zu allem Überfluss auch noch lokalisiert ist und folglich nur in Grenzen zwischen verschiedenen System-Sprachen portiert werden kann. Hinzu kommt, dass man in Batch viele banale Standardaufgaben wie zB String-Operationen aufwändig replizieren muss, was bei einer "richtigen" Script- bzw. Programmiersprache natürlich kein Thema ist.

Alles in allem ist PowerShell grundsätzlich zu bevorzugen, aber wenn man wmomöglich wenig Erfahrung hat und nur mit Mühe und Not Batch-Vorlagen von anderen verwenden und etwas erweitern kann, ist ein kompletter Umstieg auf PowerShell natürlich entsprechend schwierig.
 
  • Gefällt mir
Reaktionen: s1ave77
Was man bei Batch natürlich auch bedenken muss ist, dass bei for streng nach den Delimitern getrennt wird. Im vorliegenden Fall wird jede Zeile bei : als Trennzeichen aufgesplittet. Das bedeutet aber, dass die gefundenen Tokens alle den Wert umgebenden Leerzeichen mit einschließen. Deswegen zeigt der Output von @tomm1984 ersten Gehversuchen auch ein Leerzeichen vor der ausgelesenen (B)SSID, welches im nächsten Schritt dann per String-Operation rausgefiltert werden muss.

Einfacher ginge es so:

for /F "tokens=1,* delims=: " %%a in ('netsh wlan show interface | findstr /i "profil"') do set network=%%b

Durch die Umstellung von tokens und delims kann man das Leerzeichen als zusätzliches Trennzeichen verwenden. Deswegen sollte man im übrigen immer diese Reihenfolge einhalten, erst tokens und dann delims. Auf diese Weise sind die einzelnen Tokens bereits getrimmt, weil die Leerzeichen als Trennzeichen entfernt werden. Natürlich führt das möglicherweise zu Problemen, wenn der gesuchte Wert seinerseits Leerzeichen enthält, aber das umgeht man mit tokens=1,* . Im Klartext heißt das: "Gibt mir zwei Suchergebnisse, das erste Match und dann den Rest". In %%a stünde nun also einfach nur "SSID" ohne alles und in %%b der dazugehörige Text, also die eigentliche SSID mit allen inneren Leerzeichen, aber dennoch vorne und hinten getrimmt.

Im übrigen habe ich den Output hier auch anstelle von "SSID" nach "profil" (case insensitive) gefiltert, da dort ebenfalls die SSID stehen sollte. Mit obiger Zeile sollte man also direkt die gewünschte SSID auslesen können, ohne PS und ohne unerwünschte Leerzeichen. Mit Filter auf "SSID" geht's aber natürlich auch, wenn man die hier genannten Tips mit einbaut, also 2x findstr hintereinander.
 
  • Gefällt mir
Reaktionen: Hyourinmaru und s1ave77
danke für die vielen antworten! ich komme jetzt erst dazu und gehe gerade mal von oben durch:

Mystery1988 schrieb:
Der Befehl sollte so aussehen findstr "SSID /v BSSID"

=> leider nicht

1709309675905.png



Tzk schrieb:
Könntest du nicht einfach nach dem kompletten String inklusive Doppelpunkt, also SSID : suchen? Die SSID hat immerhin ein Leerzeichen mehr drin als die BSSID. Damit wäre der String eindeutig?!

Ja, keine schöne Lösung, aber einfach.

=> leider auch nicht

1709309881346.png


mae1cum77 schrieb:
Braucht zwei findstr hintereinander, eins für gesucht und eins für den Ausschluß, läßt sich nicht in einem machen.
Code:
for /f "delims=: tokens=2" %%n in ('netsh wlan show interface name="Wi-Fi" ^| findstr "SSID" ^| findstr /v "BSSID"') do set "Network=%%n"

=> ja, das ist es schon :) (hatte das auch mal probiert, allerdings die relevanz von pipe & hyphen nicht gerafft / gewusst) :

1709310076188.png


nochmals vielen Dank ... den Rest lese ich mir auch noch durch; aber fürs Erste reicht genau das.
1.000 Dank an alle
 
  • Gefällt mir
Reaktionen: s1ave77
mae1cum77 schrieb:
:D. Der Vorschlag von @Raijin ist allerdings auch gut ;).

Bestimmt! soweit war ich noch nicht.

Ja, PowerShell ist immer nice, aber für solch kleineren Dinge (für mich zumindest) gern mal zu heftig - da tuts immer noch batch. PowerShell ist wirklich geil, doch geht fix nen Samstag drauf :D

Hab das Ganze mal zusammengefasst und im eigentlichen Speedtest-Post platziert.
https://www.computerbase.de/forum/t...atisieren-und-auswerten.1920618/post-29184734

BTW:
Raijin schrieb:
Wahrscheinlich würde schon ein banales Leerzeichen ausreichen: findstr " SSID"
=> das liefert es leider auch nicht

1709313385330.png
 
  • Gefällt mir
Reaktionen: s1ave77
Zurück
Oben