IP-Adresse per Batch Datei auslesen (Virtuelle Adapter ausschließen)?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ipconfig ist bestenfalls geeignet um einem Administrator mal einen einfachen Überblick zum Netzwerk zu verschaffen.

In Batch ist WMIC die Schnittstelle zum WMI , welches Zugriff auf nahezu alle "Befindlichkeiten" von Windows bietet.

für Dich sind nötig:

  • Die Liste der Netzwerkadapter: wmic nic
  • Die Configurationsdaten der Netzwerladapeter: wmic nicconfig

Du möchtest wohl die Adresse eines physischen Adapters (da in einem System auch mehrere Netzwerkkarten vorhanden sein können dürften nur der/die verbundenen Adapter relevant sein. (es kann durchaus sein das sowohl LAN, WLan und/oder "Mobil via BT-/USB-Tetering" gleichzeitig aktiv sind!) Ich bündle zum Beispiel die Leistung meines Routers mit der des Anschlusses meines Nachbarn... und habe 2 aktive Adapter und 2 entsprechende IPs.

Adapter nach physisch und verbunden filtern:

wmic nic where (PhysicalAdapter=TRUE and NetEnabled=TRUE) get

Die folgende kleine Batch filtert die Adapter in obiger Weise und ermittelt die zugeteilten IPs

demo.cmd

@echo off
 rem wmi-Abfrage nach aktiven physischen Netzwerkadapter(n) gefiltert...  (TimeOfLastReset wird  nicht ausgewertet und  dient lediglich als Workarround für einen  uralten Bug in WMIC)
for /f "skip=2 tokens=2-6 delims=," %%a in ('"wmic nic where (PhysicalAdapter=TRUE and NetEnabled=TRUE) get AdapterType, MACAddress, Name, Speed, TimeOfLastReset /format:csv"') do (
 echo AdapterType=%%~a
 echo MACAddress=%%~b
 echo AdapterName=%%~c
 echo AdapterSpeed=%%~d
  rem wmi-abfrage Netzwerkonfikuration für den Adapter mit der MAC des gegenwärtig verarbeiteten Adapters ermitteln
 for /f "usebackq skip=2 tokens=2,3 delims=,;{}" %%g in (`"wmic nicconfig where MACAddress='%%~b' get ipaddress /format:csv"`) do (
  echo Interne IPv4=%%~g
  echo Verbindungslokale IPv6-Adresse=%%~h
  echo:
 )
)
pause
PowerShell ist leider keine Option für mich.

Weshalb nicht? (wenn man fragen darf)

Wird es, ob Du willst oder nicht, über kurz oder lang werden. Nach Plänen von Microsoft wird Batch in den nächsten Jahren komplett aufs "Abstellgleis gefahren". (auch wenn ich sehr gut mit Batch umgehen kann..., es wird langsam Zeit dieses verbugte Monster in Rente zu schicken.)

Investiere nicht mehr allzuviel Energie in Batch.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

BatchAnfaeng1 
Fragesteller
 01.02.2022, 16:10
Weshalb nicht? (wenn man fragen darf)

Um Vorgänge zu automatisieren habe ich schon sehr viele Vorgänge mit Batch-Dateien am laufen.

Unter anderen ein Skript, was alle Möglichen / Nötigen Daten von einem PC ausliest. Dafür brauchte ich die (von dir gelieferte) Erweiterung.

Danke Nochmal

0
BatchAnfaeng1 
Fragesteller
 02.02.2022, 13:49

Danke für deine Antwort, aber ich steige bei deinem Schleifen-System nicht durch.

Hast du eine Lösung, um die Werte vom lokalen Adapter in eine Variable zu setzen? (Adapternamen, IPv4-Adresse, Standardgateway, DNS- Server, DHCP-Server, Mac-Adresse und DHCP aktiviert [Ja oder Nein])

Danke 🙈

0
Erzesel  02.02.2022, 16:48
@BatchAnfaeng1
...aber ich steige bei deinem Schleifen-System nicht durch...

Das ist der Grund weshalb man besser auf Powershell umsteigen sollte.😏

for/f-loops sind der Horror für jeden Batchanfänger (und auch für so manchen Fortgeschrittenen) ...und es gibt noch 1000 andere blöde Dinge, welch Batch zur schwersten Sprache machen welche es gibt.

Da Du von Adapter in der Einzahl sprichst nehme ich an, in Deinem System ist nur ein aktiver Physischer Adapter vorhanden. (heutzutage nicht mehr unbedingt normal). Das macht die Variablenzuweisung relativ einfach, eignet sich jedoch nicht zum weitergeben der Batch an andere Nutzer.

Das gezielte Filtern der Ergebnisse von:

wmic nicconfig get DefaultIPGateway,DHCPEnabled,DHCPServer,DNSServerSearchOrder,IPAddress /format:csv 

...für die Variablenzuweisung , hat etwas von Tanz auf dem Vulkan, da das eventuelle Fehlen einer GatewayIPv6 die Abfolge der Ergebnisse durcheinander bringt und damit auch die Variablen falsch belegt. (mit Powershell kann sowas nicht passieren). Mit großem Aufwand könnte man dergleichen Fehlbelegungen auch in Batch fixen, aber das hätte nichts mehr mit Vernunft zu tun)

demo.cmd

@echo off
 rem Achtung, wenn die Bedingungen  auf mehrere Adapter im System zutreffen werden die Variabben  nur für den  letzten  gesetzt.
for /f "skip=2 tokens=2-6 delims=," %%a in ('"wmic nic where (PhysicalAdapter=TRUE and NetEnabled=TRUE) get AdapterType, MACAddress, Name, Speed, TimeOfLastReset /format:csv"') do (
  set "_AdapterType=%%~a"
  set "_MACAddress=%%~b"
  set "_AdapterName=%%~c"
  set "_AdapterSpeed=%%~d"
  for /f "usebackq skip=2 tokens=2-10 delims=,;{}" %%g in (`"wmic nicconfig where MACAddress='%%~b' get DefaultIPGateway,DHCPEnabled,DHCPServer,DNSServerSearchOrder,IPAddress /format:csv "`) do (
    set "_GatewayIPv4=%%~g"
    set "_GatewayIPv6=%%~h"  &rem wird kaum erwähnt und ist auf älteren Systemen nicht gesetzt, was die ganze nachfolgende Reihung in Frage  stellt!!!
    set "_DHCPEnabled=%%i"
    set "_DHCPServer=%%j"
    set "_DNSServer=%%k"
    set "_InternalIPv4=%%l"
    set "_VLIPv6=%%~m"
    set "_tempIPv6=%%~n"
    set "_IPv6=%%~o"
  )
)

echo AdapterType=%_AdapterType%
echo MACAddress=%_MACAddress%
echo AdapterName=%_AdapterName%
echo AdapterSpeed=%_AdapterSpeed%
echo IPv4-Adresse=%_InternalIPv4%
echo IPv6-Adresse=%_IPv6%
echo Temporäre IPv6-Adresse=%_tempIPv6%
echo Verbindungslokale IPv6-Adresse=%_VLIPv6%
echo Standardgateway=%_GatewayIPv4%
echo DHCP aktiv=%_DHCPEnabled%
echo DHCPServer=%_DHCPServer%
echo DNSServer=%_DNSServer%
pause

Dergleichen ist natürlich nicht geeignet um irgendwie als "selbstgeschriebenes Programm" an andere Nutzer weitergegeben zu werden.

Viele Anfänger geben sich der Illusion hin mal schnell und einfach ein "Programm" in Batch zu schreiben, um Irgendwie bei anderen Leuten anzugeben, oder was weiß ich? Aber kaum das etwas mehr nötig ist als ein wenig: echo oder set/p fangen die Hirnzellen an zu kokeln😱🥵😵🥴

Die Automatisierte Zuweisung von Daten an Variablen ist in Batch nur über den For/f-Befehl möglich , dabei ist die geeignete Trennung der Ausgabezeilen eher eine Sache von Fantasie und Erfahrung des Programmierers , als in Stein gemeiselte "Wissenschaft".

Anmerkung für evtl. mitlesende "Profis" :

Es ist sehr wohl möglich auch für mehrere Adapter Variablen zu setzen (intizierte PseudoArrays). Da würden einem Anfänger jedoch die letzte Hirnzelle verschmoren, weil ich dann Variablen erzeugen würde, welche nicht direkt definiert wären und ggf per verzögerter Variablenexpansion abgerufen werden müssen

2
Erzesel  02.02.2022, 17:44
@BatchAnfaeng1

PS:

So sollte es einigermaßen mit eventuell unterschiedlichen Reihungen der Werte klarkommen:

@echo off
 rem Achtung, wenn die Bedingungen  auf mehrere Adapter im System zutreffen werden die Variabben  nur für den  letzten  gesetzt.
for /f "skip=2 tokens=2-6 delims=," %%a in ('"wmic nic where (PhysicalAdapter=TRUE and NetEnabled=TRUE) get AdapterType, MACAddress, Name, Speed, TimeOfLastReset /format:csv"') do (
  set "_AdapterType=%%~a"
  set "_MACAddress=%%~b"
  set "_AdapterName=%%~c"
  set "_AdapterSpeed=%%~d"
  for /f "usebackq skip=2 tokens=2-6 delims=," %%g in (`"wmic nicconfig where MACAddress='%%~b' get DefaultIPGateway,DHCPEnabled,DHCPServer,DNSServerSearchOrder,IPAddress /format:csv "`) do (
      rem GatewayIP(s) in %%g in  v4 und v6 splitten (falls v6 vorhanden) 
    for /f "tokens=1,2 delims=;{}" %%A in ("%%g")  do (
      set "_GatewayIPv4=%%~A"
      set "_GatewayIPv6=%%~B"
    )
    set "_DHCPEnabled=%%h"
    set "_DHCPServer=%%i"
      rem mögliche zwei DNSServer in %%j verteilen (falls vorhanden) 
    for /f "tokens=1,2 delims=;{}" %%A in ("%%j")  do (
      set "_DNSServer1=%%~A"
      set "_DNSServer2=%%~B"
    )
    rem IP(s) in %%k in v4 und v6 splitten (falls v6 vorhanden) 
    for /f "tokens=1-4 delims=;{}" %%A in ("%%k")  do (
      set "_InternalIPv4=%%~A"
      set "_VLIPv6=%%~B"
      set "_tempIPv6=%%~C"
      set "_IPv6=%%~D"
    )
  )
)


echo AdapterType=%_AdapterType%
echo MACAddress=%_MACAddress%
echo AdapterName=%_AdapterName%
echo AdapterSpeed=%_AdapterSpeed%
echo IPv4-Adresse=%_InternalIPv4%
echo IPv6-Adresse=%_IPv6%
echo Temporäre IPv6-Adresse=%_tempIPv6%
echo Verbindungslokale IPv6-Adresse=%_VLIPv6%
echo Standardgateway=%_GatewayIPv4%
echo DHCP aktiv=%_DHCPEnabled%
echo DHCPServer=%_DHCPServer%
echo DNSServer1=%_DNSServer1%
if  defined _DNSServer2 (echo DNSServer2=%_DNSServer2%)
pause

...damit wird das Ding aber schon zum "Monster".


1