Batch zum auslesen bestimmter Einträge der IPconfig mit for-Schleifen
Guten Tag zusammen,
dies ist mein erster Beitrag.
Ich habe schon länger versucht eine Lösung für mein Problem zu finden, allerdings habe ich noch keine gefunden.
Ich habe eine kleine Batch zusammen gebastelt die eine .txt mit den wichtigsten Daten zum Rechner und Benutzer erzeugt und diese an eine E-Mail anhängt.
Leider komme ich an bestimmte Daten nicht so ran wie ich es möchte.
Mit folgendem will ich die IP-Adresse und die DNS-Server auslesen, soweit klappt es auch, allerdings bekomme ich bei dem DNS-Server nur die erste Zeile und nicht die darauf folgenden mit weiteren IPs.
Den folgenden Code setze ich mehrmals hintereinander und frage so die Zeilen nacheinander ab. Am Ende findet immer ein Verlgeich statt, ob die gesetzte Variable mit dem Eintrag "Primärer" aus der ipconfig identisch ist oder nicht. Falls nicht soll die Variabel in eine andere .txt geschrieben werden, falls sie identisch sind, soll nichts passieren und die Batch mit dem nächsten Punkt auf meiner Liste weiter machen.
Da ich keinen Delimiter bestimmt habe wird nur der erste Eintrag einer Zeile ausgelesen, was in diesem Fall auch ausreichend ist. Die zusätzlichen IPs stehen alleine in einer Zeile und vom Eintrag "Primärer WINS-Server" wird so nur das "Primärer" abgefragt.
Das Problem habe ich unten bei dem Vergleich, aufgrund des Umlautes bekomme ich es nicht hin einen funktionierenden Vergleich zu machen. Ich habe auch schon versucht die Umlaute mit einer Batch zu ersetzen, bin hier aber nicht weiter gekommen.
Mit den for-Schleifen bin ich noch nicht so bewandert und habe es deswegen auch nicht geschafft eine Schleife zu bauen, die selbst vom Eintrag "DNS-Server" bis zum Eintrag "Primärer WINS-Server" prüft und die IPs in eine andere Datei schreibt (falls das überhaupt möglich ist). Daher nehme ich den umständlichen Weg und Frage mehrere Zeilen nach einander ab indem ich die Zeilennummer anpasse und den Code wiederhole.
Ich hoffe es ist verständlich wo mein Problem liegt.
Ich bedanke mich schon mal für kommende Hilfe.
EDIT:
Da tippt man sich ein mal sein Problem von der Seele und dann findet man direkt selbst die Lösung.
Ich habe einfach ein Token eingefügt, dadurch überspringe ich das Wort mit dem Umlaut und mein Problem ist gelöst, der Vergleich funktioniert sofort.
Ich würde mich trotzdem noch dafür interessieren ob es für mein Problem eine elegantere Lösung gibt.
EDIT:
Und zu früh gefreut, durch mein gesetztes Token funktioniert jetzt zwar der Vergleich in der Zeile mit dem Primären WINS-Server, aber dafür nicht mehr in den Zeilen darüber.
dies ist mein erster Beitrag.
Ich habe schon länger versucht eine Lösung für mein Problem zu finden, allerdings habe ich noch keine gefunden.
Ich habe eine kleine Batch zusammen gebastelt die eine .txt mit den wichtigsten Daten zum Rechner und Benutzer erzeugt und diese an eine E-Mail anhängt.
Leider komme ich an bestimmte Daten nicht so ran wie ich es möchte.
Mit folgendem will ich die IP-Adresse und die DNS-Server auslesen, soweit klappt es auch, allerdings bekomme ich bei dem DNS-Server nur die erste Zeile und nicht die darauf folgenden mit weiteren IPs.
ipconfig /all > IP.txt
find IP.txt "IPv4-Adresse" >> C:\Users\%Username%\Documents\Support.txt
find IP.txt "DNS-Server" >> C:\Users\%Username%\Documents\Support.txt
del IP.txt
Den folgenden Code setze ich mehrmals hintereinander und frage so die Zeilen nacheinander ab. Am Ende findet immer ein Verlgeich statt, ob die gesetzte Variable mit dem Eintrag "Primärer" aus der ipconfig identisch ist oder nicht. Falls nicht soll die Variabel in eine andere .txt geschrieben werden, falls sie identisch sind, soll nichts passieren und die Batch mit dem nächsten Punkt auf meiner Liste weiter machen.
Da ich keinen Delimiter bestimmt habe wird nur der erste Eintrag einer Zeile ausgelesen, was in diesem Fall auch ausreichend ist. Die zusätzlichen IPs stehen alleine in einer Zeile und vom Eintrag "Primärer WINS-Server" wird so nur das "Primärer" abgefragt.
set LineNo=39
set "line="
set /a LineNo-=1
for /f %%b in ('more/e +%LineNo% ^< IP.txt') do (
if not defined line set "line=%%b"
)
if not "%line%"=="Primärer" (
echo %line% >> Probe.txt
Das Problem habe ich unten bei dem Vergleich, aufgrund des Umlautes bekomme ich es nicht hin einen funktionierenden Vergleich zu machen. Ich habe auch schon versucht die Umlaute mit einer Batch zu ersetzen, bin hier aber nicht weiter gekommen.
Mit den for-Schleifen bin ich noch nicht so bewandert und habe es deswegen auch nicht geschafft eine Schleife zu bauen, die selbst vom Eintrag "DNS-Server" bis zum Eintrag "Primärer WINS-Server" prüft und die IPs in eine andere Datei schreibt (falls das überhaupt möglich ist). Daher nehme ich den umständlichen Weg und Frage mehrere Zeilen nach einander ab indem ich die Zeilennummer anpasse und den Code wiederhole.
Ich hoffe es ist verständlich wo mein Problem liegt.
Ich bedanke mich schon mal für kommende Hilfe.
EDIT:
Da tippt man sich ein mal sein Problem von der Seele und dann findet man direkt selbst die Lösung.
Ich habe einfach ein Token eingefügt, dadurch überspringe ich das Wort mit dem Umlaut und mein Problem ist gelöst, der Vergleich funktioniert sofort.
Ich würde mich trotzdem noch dafür interessieren ob es für mein Problem eine elegantere Lösung gibt.
EDIT:
Und zu früh gefreut, durch mein gesetztes Token funktioniert jetzt zwar der Vergleich in der Zeile mit dem Primären WINS-Server, aber dafür nicht mehr in den Zeilen darüber.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 339287
Url: https://administrator.de/contentid/339287
Ausgedruckt am: 04.11.2024 um 22:11 Uhr
12 Kommentare
Neuester Kommentar
Hi, willkommen im Forum.
Möglicherweise ist dein Problem die Codepage, mit der in der Konsole gearbeitet wird.
Mit chcp bekommst du raus. was bei dir eingestellt ist.
Windows verwindet standardäßig die Codepage 1252, in der Konsole des deutschsprachigen Windows wird - je nach OS-Version- die Codepage 850 verwendet. Probiere mal einen Wechsel mit
<code >CHCP Codepagenummer
Alternative:
Du stellst dein Textverarbeitungsprogramm (wenn das geht!) , mit dem du vergleichst, um auf die Codepage, die in der Konsole verwendet wird.
Gruß
Möglicherweise ist dein Problem die Codepage, mit der in der Konsole gearbeitet wird.
Mit chcp bekommst du raus. was bei dir eingestellt ist.
Windows verwindet standardäßig die Codepage 1252, in der Konsole des deutschsprachigen Windows wird - je nach OS-Version- die Codepage 850 verwendet. Probiere mal einen Wechsel mit
<code >CHCP Codepagenummer
Alternative:
Du stellst dein Textverarbeitungsprogramm (wenn das geht!) , mit dem du vergleichst, um auf die Codepage, die in der Konsole verwendet wird.
Gruß
Hol dir EditPadLight, aktuelle Version gibt's u.A. da von einer schnellen und sicheren Quelle:
https://www.computerbase.de/downloads/systemtools/editpad-lite/
Damit kannst du die Codepage anpassen, die die Konsole verwendet.
https://www.computerbase.de/downloads/systemtools/editpad-lite/
Damit kannst du die Codepage anpassen, die die Konsole verwendet.
Hallo Dantaros,
Ich hab noch nicht ganz verstanden wo Du eigentlich hin möchtest.
Ist Dein Ziel eine
Falls dem so ist, dann zeig doch bitte mal eine
Gruß Frank
Ich hab noch nicht ganz verstanden wo Du eigentlich hin möchtest.
Ist Dein Ziel eine
Support.txt
und Deine Quelle dafür sind Infos von ipconfig.exe
?Falls dem so ist, dann zeig doch bitte mal eine
Support.txt
, die genau so aussieht, wie Du sie gerne hättest, dann fällt es leichter über den Weg dahin zu sinnieren.Gruß Frank
Wozu man hierzu noch Batch nutzt ist mir sowieso unergründlich, wenn mit Batch dann lese es doch eindeutig mit WMI aus, anstatt dieses "Gehampel" mit IPConfig, das stellen sich einem ja die Haare ...
Grüße Uwe
for /f "tokens=1,2 delims=={}" %%a in ('wmic nicconfig where "IPEnabled=True" get DefaultIPGateway^,DnsServerSearchOrder^,IPAddress /value ^| findstr "="') do @echo %%a : %%b
Hallo Dantaros,
ohne mich jetzt näher mit Deinem Code oder einer Problemlösung zu beschäftigen: Dein Problem ist, dass Du die Batch-Datei in der falschen Zeichen-Codierung abgespeichert hast. Speichere sie in der Codierung OEM 850 und das Wörtchen
Ich nutze zum Schreiben von Batch-Files Notepad++ (Open Source und kostenlos). Für diesen Editor habe ich vor kurzem das Plugin AutoCodepage entdeckt. Nach der Installation und Konfiguration des Plugins schaltet Notepad++ beim Editieren von Batch-Dateien automatisch auf die richtige Zeichencodierung um, damit haben sich solche Problemchen wie Deines in Zukunft erledigt.
Grüße
Friemler
ohne mich jetzt näher mit Deinem Code oder einer Problemlösung zu beschäftigen: Dein Problem ist, dass Du die Batch-Datei in der falschen Zeichen-Codierung abgespeichert hast. Speichere sie in der Codierung OEM 850 und das Wörtchen
Primärer
wird beim Vergleich auch erkannt.Ich nutze zum Schreiben von Batch-Files Notepad++ (Open Source und kostenlos). Für diesen Editor habe ich vor kurzem das Plugin AutoCodepage entdeckt. Nach der Installation und Konfiguration des Plugins schaltet Notepad++ beim Editieren von Batch-Dateien automatisch auf die richtige Zeichencodierung um, damit haben sich solche Problemchen wie Deines in Zukunft erledigt.
Grüße
Friemler
Hallo Dantaros,
danke für das Skript.
Da kann man sich durchaus das Eine oder Andere anschauen.
Mich stört etwas die "unsaubere" Ausgabe in Bezug auf Ausrichtung und unnötige Leerzeichen an den Zeilenenden und IP-Adressen in Anführungszeichen.
Um die Ausgabe etwas aufzuhübschen, was allerdings Geschmacksache ist, habe ich Dein Skript modifiziert.
Die Änderungen und Ergänzungen habe ich teilweise mit REM-Zeilen kommentiert, wo ich annahm, dass sie nicht selbsterklärend sind.
Support.cmd
Eine resultierende Ausgabe sieht damit exemplarisch so aus:
Support.txt
Falls es Dir gefällt und Du Fragen haben solltest, dann melde Dich.
Gruß Frank
danke für das Skript.
Da kann man sich durchaus das Eine oder Andere anschauen.
Mich stört etwas die "unsaubere" Ausgabe in Bezug auf Ausrichtung und unnötige Leerzeichen an den Zeilenenden und IP-Adressen in Anführungszeichen.
Um die Ausgabe etwas aufzuhübschen, was allerdings Geschmacksache ist, habe ich Dein Skript modifiziert.
Die Änderungen und Ergänzungen habe ich teilweise mit REM-Zeilen kommentiert, wo ich annahm, dass sie nicht selbsterklärend sind.
Support.cmd
@echo off
title Support E-Mail
REM enabledelayedexpansion, damit Variablen in For-Schleifen veränderbar werden.
setlocal enabledelayedexpansion
REM Ausgabedatei festlegen
set ausgabe=C:\Users\%Username%\Documents\Support.txt
::Variablen für die Office Version
set Office2016="C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE"
set Office2013="C:\Program Files\Microsoft Office 15\root\office15\OUTLOOK.EXE"
set Office2010="C:\Program Files (x86)\Microsoft Office\Office14\OUTLOOK.EXE"
::Inhalt des Anhangs
REM Zusätzlich Datum und Zeit ausgeben
>%ausgabe% echo Stand : %date% %time:~0,-3%
>>%ausgabe% echo(
>>%ausgabe% echo Hostname : %Computername%
>>%ausgabe% echo Benutzer : %Username%
::Windowsversion
for /f "tokens=*" %%a in ('wmic os get caption^, OSArchitecture ^| find /i /v "caption"') do (
set windows=%%a
REM Tabulator am ende entfernen
set windows=!windows:~0,-1!
REM Leerzeichen am Ende entfernen (max. 10 Stück)
for /l %%b in (1,1,10) do if "!windows:~-1!" == " " set windows=!windows:~0,-1!
if "!windows!" NEQ "" >>!ausgabe! echo Windowsversion : !windows!
)
::Verfügbarer Speicherplatz
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get Size /value`) do set size=%%x
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get Freespace /value`) do set free=%%x
set /A sizemb=%size:~,-7%
set /A freemb=%free:~,-7%
>>%ausgabe% echo Festplattengröße : %sizemb% MB
>>%ausgabe% echo freier Speicherplatz: %freemb% MB
>>%ausgabe% echo(
::IP Adresse und DNS-Server
for /f "tokens=1,2 delims=={}" %%a in ('wmic nicconfig where "IPEnabled=True" get DefaultIPGateway^,DnsServerSearchOrder^,IPAddress /value ^| findstr "="') do (
set var=%%~a
set value=%%b
REM Anführungszeichen entfernen
set value=!value:"=!
REM Leerzeichen hinter Komma einfügen
set value=!value:,=, !
if "!var!" == "DefaultIPGateway" >>!ausgabe! echo Default-Gateway : !value!
if "!var!" == "DNSServerSearchOrder" >>!ausgabe! echo DNS-Suchreihenfolge : !value!
if "!var!" == "IPAddress" >>!ausgabe! echo IP-Adresse : !value!
)
::Generieren der E-Mail mit Anhang
if exist %Office2016% (
>>!ausgabe! echo(
>>!ausgabe! echo Office-Version : Microsoft Office 2016
REM ausgabe ist in Anführungszeichen gesetzt, für den Fall dass der Pfad Leerzeichen enthält.
%Office2016% /c ipm.note /a "%ausgabe%"
set office=gefunden
)
if exist %Office2013% (
>>!ausgabe! echo(
>>!ausgabe! echo Office-Version : Microsoft Office 2013
%Office2013% /c ipm.note /a "%ausgabe%"
set office=gefunden
)
if exist %Office2010% (
>>!ausgabe! echo(
>>!ausgabe! echo Office-Version : Microsoft Office 2010
%Office2010% /c ipm.note /a "%ausgabe%"
set office=gefunden
)
if "%office%" == "" (
REM Hier tun was getan werden soll, um den Fehler zu bemerken
>>!ausgabe! echo(
>>!ausgabe! echo Office-Version : nicht gefunden
echo Alarm
pause
)
Eine resultierende Ausgabe sieht damit exemplarisch so aus:
Support.txt
Stand : 31.05.2017 14:01:30
Hostname : RECHNERNAME
Benutzer : Dau
Windowsversion : Microsoft Windows 10 Pro 64-Bit
Festplattengröße : 164692 MB
freier Speicherplatz: 106344 MB
Default-Gateway : 192.168.0.1
DNS-Suchreihenfolge : 192.168.0.3, 192.168.0.2
IP-Adresse : 192.168.0.60
Office-Version : Microsoft Office 2010
Falls es Dir gefällt und Du Fragen haben solltest, dann melde Dich.
Gruß Frank
Hi,,
Vorschlag zur Modifikation:
Absolute Bezüge entfernen, Variablen verwenden .
C:\Users\%Username% in "%USERPROFILE%" (mit Anführungzeichen evtl. um den gesamten Pfad, Username könnte Leerzeichen enthalten!)
Wobei ich nicht weiß , ob Userprofile in Domänenumgebungen zutrifft. dazu siehe @Pedant nachfolgend.
C: in %SYSTEMDRIVE%
Das funktioniert auch dann, wenn das Start-Volume nicht auf C: liegt.
Gruß
Vorschlag zur Modifikation:
Absolute Bezüge entfernen, Variablen verwenden .
C:\Users\%Username% in "%USERPROFILE%" (mit Anführungzeichen evtl. um den gesamten Pfad, Username könnte Leerzeichen enthalten!)
Wobei ich nicht weiß , ob Userprofile in Domänenumgebungen zutrifft. dazu siehe @Pedant nachfolgend.
C: in %SYSTEMDRIVE%
Das funktioniert auch dann, wenn das Start-Volume nicht auf C: liegt.
Gruß
Hallo hugonatter,
gute Vorschläge, kleine Anmerkung...
%SYSTEMDRIVE% = C: (nicht C:\ wobei Dantaros es ohnehin ohne Backslash braucht)
In Domänenumgebung mit serverbasierenden Profilen sollte
Eine Echo-Ausgabe in eine Datei mit UNC-Pfad umzuleiten funktioniert auch.
In Dantaros' Fall sind es aber ohnehin nur lokale Pfade.
@Dantaros
wird die Datei
Falls nicht, könnte sie auch in Temp erstellt
und anschließend gelöscht werden.
oder in meiner Variante
Gruß Frank
gute Vorschläge, kleine Anmerkung...
%SYSTEMDRIVE% = C: (nicht C:\ wobei Dantaros es ohnehin ohne Backslash braucht)
In Domänenumgebung mit serverbasierenden Profilen sollte
"%USERPROFILE%
sowas in der Art wie \\Server\Freigabe\ordner\%username%
sein, also formal ein UNC-Pfad.Eine Echo-Ausgabe in eine Datei mit UNC-Pfad umzuleiten funktioniert auch.
In Dantaros' Fall sind es aber ohnehin nur lokale Pfade.
@Dantaros
wird die Datei
Support.txt
überhaupt noch benötigt, wenn der E-Mailversand erfolgt ist?Falls nicht, könnte sie auch in Temp erstellt
%temp%\Support.txt
und anschließend gelöscht werden.
if exist %temp%\Support.txt del %temp%\Support.txt
oder in meiner Variante
if exist %ausgabe% del %ausgabe%
Gruß Frank
Hi, Pedant,
danke für die kleine Anmerkung Wird gleich geändert. (Das wusste ich zwar mal, hab's aber vergessen )
Das vergessene Anführungszeichen am Ende von "%userprofile% habe ich dann auch noch gleich hinzugefügt.
Gruß
danke für die kleine Anmerkung Wird gleich geändert. (Das wusste ich zwar mal, hab's aber vergessen )
Das vergessene Anführungszeichen am Ende von "%userprofile% habe ich dann auch noch gleich hinzugefügt.
Gruß