dantaros
Goto Top

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.
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.

Content-ID: 339287

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

Ausgedruckt am: 04.11.2024 um 22:11 Uhr

114685
114685 30.05.2017 aktualisiert um 14:45:51 Uhr
Goto Top
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ß
Dantaros
Dantaros 30.05.2017 um 15:06:27 Uhr
Goto Top
Danke für die Antwort.

Mit chcp hab ich auch schon mehrmals rumprobiert, aber ich bin nie zu einem passenden Ergebnis gekommen.
Da wurde auch jedes mal in das .txt Primärer mit anderen Zeichen für das "ä" geschrieben (sollte eigentlich gar nichts stehen).
114685
114685 30.05.2017 aktualisiert um 15:11:31 Uhr
Goto Top
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.
Pedant
Pedant 30.05.2017 um 15:22:14 Uhr
Goto Top
Hallo Dantaros,

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
colinardo
Lösung colinardo 30.05.2017 aktualisiert um 18:22:25 Uhr
Goto Top
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 ...
for /f "tokens=1,2 delims=={}" %%a in ('wmic nicconfig where "IPEnabled=True" get DefaultIPGateway^,DnsServerSearchOrder^,IPAddress /value ^| findstr "="') do @echo %%a : %%b  
Grüße Uwe
Friemler
Friemler 30.05.2017 um 21:46:14 Uhr
Goto Top
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 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
Dantaros
Dantaros 31.05.2017 aktualisiert um 11:08:00 Uhr
Goto Top
Batch hat sich irgendwie so ergeben.

Genau sowas habe ich gesucht.


Das Plugin werde ich mir gleich auch noch angucken.

Dankeschön an alle
Dantaros
Dantaros 31.05.2017 um 11:17:16 Uhr
Goto Top
Falls es noch jemanden interessiert, so sieht es aktuell fertig aus.
@echo off
title Support E-Mail

::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
echo Hostname: %Computername%	> C:\Users\%Username%\Documents\Support.txt
echo Benutzer: %Username% >> C:\Users\%Username%\Documents\Support.txt

::Windowsversion
wmic os get caption, OSArchitecture | find /i /v "caption" >> C:\Users\%Username%\Documents\Support.txt  

::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%

echo Festplattengröße: %sizemb% MB >> C:\Users\%Username%\Documents\Support.txt
echo freier Speicherplatz: %freemb% MB >> C:\Users\%Username%\Documents\Support.txt
echo. >>C:\Users\%Username%\Documents\Support.txt

::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 @echo %%a >>C:\Users\%Username%\Documents\Support.txt : %%b >>C:\Users\%Username%\Documents\Support.txt  
echo. >>C:\Users\%Username%\Documents\Support.txt

::Generieren der E-Mail mit Anhang

if exist %Office2016% (
	echo Microsoft Office 2016 >> C:\Users\%Username%\Documents\Support.txt
	%Office2016% /c ipm.note /a C:\Users\%Username%\Documents\Support.txt
	)
if exist %Office2013% (
	echo Microsoft Office 2013 >> C:\Users\%Username%\Documents\Support.txt
	%Office2013% /c ipm.note /a C:\Users\%Username%\Documents\Support.txt
	)
if exist %Office2010% (
	echo Microsoft Office 2010 >> C:\Users\%Username%\Documents\Support.txt
	%Office2010% /c ipm.note /a C:\Users\%Username%\Documents\Support.txt
	)
Pedant
Pedant 31.05.2017 um 14:22:11 Uhr
Goto Top
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
@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
114685
114685 31.05.2017 aktualisiert um 18:58:18 Uhr
Goto Top
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. face-smile

Gruß
Pedant
Pedant 31.05.2017 um 16:29:42 Uhr
Goto Top
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
"%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
114685
114685 31.05.2017 aktualisiert um 16:49:20 Uhr
Goto Top
Hi, Pedant,

danke für die kleine Anmerkung Wird gleich geändert. (Das wusste ich zwar mal, hab's aber vergessen face-smile )
Das vergessene Anführungszeichen am Ende von "%userprofile% habe ich dann auch noch gleich hinzugefügt.

Gruß