kkboy94
Goto Top

Batch so umschreiben, dass alles in eine Datei passt

Ja der Thementitel sagt eigentlich schon, wobei mir geholfen werden soll.

Der folgende Code soll halt so umgeschrieben werden, dass mir keine temporären Dateien während des Vorgangs erstellt werden:
@echo off & setlocal
echo set /a s=%%s%%+1 > ip.bat
echo set ip%%s%%=%%1 >> ip.bat
set log=netz.txt
del %log% 2>nul
echo Deine IP Adressen sind:
echo.
ipconfig/all | findstr "IP-Ad" > ip.txt
set s=0
for /f "tokens=14*" %%i in (ip.txt) do call ip %%i%%j
pause
del ip.txt
del ip.bat
echo %ip1%
Ich hoffe ihr könnt mir helfen

MfG Karsten

Content-ID: 146078

Url: https://administrator.de/forum/batch-so-umschreiben-dass-alles-in-eine-datei-passt-146078.html

Ausgedruckt am: 23.12.2024 um 03:12 Uhr

Biber
Biber 01.07.2010 um 19:41:35 Uhr
Goto Top
Moin kkboy94,

hast du toll kommentiert, diesen Code.

Ich will da ja nicht wieder den Wüstenrufer spielen müssen, aber wenn jetzt genauso kommentarfreie Lösungen kommen, dann hilft dir das nur begrenzt.

Anyhow, ohne Temporärmüllerei in etwa so (Demo am CMD-Prompt; ">" nicht mit eingeben):
> @(echo Deine IP-Adressen sind) & @for /f "tokens=1,3 delims=:" %i in ('ipconfig/all^|findstr "IP-Ad"^|findstr /n $') do @echo. IP%i=%j
Ausgabe wäre sinngemäß:
Deine IP-Adressen sind
 IP1= xxx.168.1.130
 IP2= zz.180.xxx.37

Solche kommentarfreien Hütchenspieler-Kunststücke gibt es aber auch anner Tanke....

Grüße
Biber
kkboy94
kkboy94 01.07.2010 um 19:49:36 Uhr
Goto Top
Entschuldigung für das Nicht-kommentieren, aber um ehrlich zu sein:
Wenn ich das wirklich alles selbst gemacht hätte, wüsste ich ja, was wie und warum funktioniert. De facto also ---> Ich habs von ner anderen Internetseite, auf der das auch genauso wenig kommentiert ist. Bei Wunsch kann ich die ja auch mal posten.


Achja, hätt ich fast vergessen. DANKE funktioniert super. Muss ich nur noch in die Restbatch einbauen.

[OT]
Welche Sprachen kannst du eigentlich alle, Biber?
[/OT]

MfG Karsten
Biber
Biber 01.07.2010 um 20:27:26 Uhr
Goto Top
Moin kkboy94,

Zitat von @kkboy94:
Entschuldigung für das Nicht-kommentieren, ....
Der Tag heute hat doch noch 4 Stunden... und notfalls noch die Nacht *g
Ich habs von ner anderen Internetseite, auf der das auch genauso wenig kommentiert ist.
Dann bring es wieder dahin zurück bitte. face-wink
Bei Wunsch kann ich die ja auch mal posten.
Ja nee...eilt nicht...
Mal noch ne kurze Frage: Wie kommst du auf "findstr /n $" in der Schleife?
"Findstr.exe" akzeptiert im Gegensatz zu "find.exe" auch
1) Such-Argumente ohne die Anführungszeichen drumherum
2) Und interpretiert u.a. die Zeichen "$" und "^" als "Nicht als Zeichen gemeint" . "^" bedeutet "(am) Zeilenanfang" und "$" bedeutet "(am) Zeilenende"

Beispiele für die Nutzung wären
FindStr "^a" *.txt --------> alle Zeilen aller *.txt-Dateien, die "am Zeilenanfang" beginnen mit "a"
Findstr "y$" *.txt -------> alle Zeilen aller *.txt-Dateien, die direkt vor dem Zeilenende ein "y" stehen haben.
FindStr "^$" *.txt -------> alle Leerzeilen, d.h. auf den Zeilenbeginn folgt sofort das Zeilenende

Der Parameter /n ist abgeleitet von "/nuMalAlleDurchzählen" und nummeriert die Ergebniszeilen stupide durch.

[OT]
Welche Sprachen kannst du eigentlich alle, Biber?
[/OT]

Hmm, "können" eigentlich keine wirklich.
Die meisten Makro- und Interpreterwerkzeuge machen mir nicht so richtig Angst... (also so die Leichtgewichte von CMD-Batch bis VBS/VBA).
In einige "echten" Programmiersprachen habe ich zumindest programmiert und für das Ergebnis Geld erhalten.
Früher ASM, COBOL, Clipper/xBASE-Dialekte, C; später VB/.#.NET, Java und immer wieder SQL.

Aber eigentlich beschäftige mich ich eher mit DWHs, DataMining, ETL-Prozessen und dem Konvertieren heterogener Datenfriedhöfe in zwölfdimensionale Cubes & Slices.

Das beim Skripten erlernte Fluchen in 17++ Sprachen kann ich dabei weiternutzen.

Grüße
Biber
kkboy94
kkboy94 01.07.2010 um 20:40:44 Uhr
Goto Top
> Bei Wunsch kann ich die ja auch mal posten.
Ja nee...eilt nicht...
Ist das jetzt ein JA?

> Mal noch ne kurze Frage: Wie kommst du auf "findstr /n $" in der Schleife?
"Findstr.exe" akzeptiert im Gegensatz zu "find.exe" auch
1) Such-Argumente ohne die Anführungszeichen drumherum
2) Und interpretiert u.a. die Zeichen "$" und "^" als "Nicht als Zeichen gemeint" . "^"
bedeutet "(am) Zeilenanfang" und "$" bedeutet "(am) Zeilenende"

Beispiele für die Nutzung wären
FindStr "^a" *.txt --------> alle Zeilen aller *.txt-Dateien, die "am Zeilenanfang" beginnen mit
"a"
Findstr "y$" *.txt -------> alle Zeilen aller *.txt-Dateien, die direkt vor dem Zeilenende ein "y"
stehen haben.
FindStr "^$" *.txt -------> alle Leerzeilen, d.h. auf den Zeilenbeginn folgt sofort das Zeilenende

Der Parameter /n ist abgeleitet von "/nuMalAlleDurchzählen" und nummeriert die Ergebniszeilen stupide durch.
Ahh gut Danke. ich hatte in der zwischenzeit auch mal die cmd-Hilfe bemüht und habe da etwas ähnliches gefunden und erfolgreich.............nicht verstanden, aber jetzt hab ichs verstanden.

Aber eigentlich beschäftige mich ich eher mit DWHs, DataMining, ETL-Prozessen und dem Konvertieren
heterogener Datenfriedhöfe in zwölfdimensionale Cubes & Slices.
Der letzte teil hört sich mörderisch an


Nun ja......
jetzt habe ich mir TimoBeil's letzte Anleitung zu Gemüte geführt bevor ich dann deinen Teil auch noch eingesetzt hab.
das erste mal hats funktioniert, aber dann nicht mehr. Und irgendwie habe ich das Gefühl, durch das Einsetzen stimmt da einiges nicht mehr.
Könntest du mir da vielleicht noch einmal helfen?

@echo off & setlocal
del %log% 2>nul
set log=netz.txt
rem Es wird jede IP für jedes aktive Netzwerkadapter herausgefunden und auf dem Bildschirm angezeigt
echo Deine IP-Adressen sind & for /f "tokens=1,3 delims=:" %%i in ('ipconfig/all^|findstr "IP-Ad"^|findstr /n $') do @echo. IP%%i=%%j  
rem hier wird die oben herausgefundene IP für den weiter unten beschriebenen Vorgang "vorbereitet"  
for /f "tokens=1,2,3 delims=." %%a in ("%%j") do set ipa=%%a.%%b.%%c.  
echo %ipa%
rem Nun sollen alle Möglichen Ip's eines C-Klasse-Netzwerks angepingt werden und das Ergebnis in ein log geschrieben werden  
FOR /L %%p IN (1,1,254) do title %ipa%%%p && for /f "tokens=2 delims= " %%A in ('ping -a %ipa%%%p -n 1 ^| FIND "[%ipa%%%p]"') DO ECHO.%%A;%ipa%%%p>>%log%  
echo.
pause
Biber
Biber 01.07.2010 um 21:23:30 Uhr
Goto Top
Moin kkboy94,

einmal grob drübergeharkt habe ich, aber nichts getestet.

Sicher ist:
  • die Zeilen 2 und 3 in deinem Schnipsel müssen getauscht werden
  • es müssen beide FOR-jede-IP-nudele-mit-FOR-alle-vorhandenen-Subnetze-druch-Anweisungen auch ineinander geschraubt werden.

Skizze liegt bei.

@echo off & setlocal
set "log=netz.txt" & :: Böse Falle...   
:: --> wenn du den Batch aus Verzeichnis "D:\temp" heraus aufrufst--> Logfile "D:\Temp\netz.txt  
:: --> wenn du den Batch aus Verzeichnis "C:\....\Desktop" heraus aufrufst--> Logfile "C:\...Desktop\netz.txt  

del %log% 2>nul

rem Es wird jede IP für jedes aktive Netzwerkadapter herausgefunden und auf dem Bildschirm angezeigt
echo Deine IP-Adressen sind 
for /f "tokens=1,3 delims=:" %%i in ('ipconfig/all^|findstr "IP-Ad"^|findstr /n $') do (  
       echo. IP%%i=%%j
       rem hier wird die oben herausgefundene IP für den weiter unten beschriebenen Vorgang "vorbereitet"  
      Call :TMosPart %%j
)    

:goto :eof 
-------> Ende des ganzen Batches
      ### Raum für Notizen ###
      
:TMosPart
for /f "tokens=1,2,3 delims=." %%a in ("%~1") do set ipa=%%a.%%b.%%c.  
echo %ipa%

::-------> ab hier hab ich nicht mehr geschaut, was da gemacht wird, nur die Zeilenumbrüche  reinformatiert
rem Nun sollen alle Möglichen Ip's eines C-Klasse-Netzwerks angepingt werden und das Ergebnis in ein log geschrieben werden  
FOR /L %%p IN (1,1,254) do (
     title %ipa%%%p 
     for /f "tokens=2 delims= " %%A in (  
         'ping -a %ipa%%%p -n 1 ^| FIND "[%ipa%%%p]"'  
         ) DO ECHO.%%A;%ipa%%%p>>%log%
  )       
echo.

goto :eof ::Ende von TMosPart

pause

Grüße
Biber

P.S:
Aber eigentlich beschäftige mich ich eher mit DWHs, DataMining, ETL-Prozessen und dem Konvertieren
heterogener Datenfriedhöfe in zwölfdimensionale Cubes & Slices.
Der letzte teil hört sich mörderisch an
Sagen wir so... - wenn es funktioniert, lässt sich damit ALLES berechnen, belegen und beweisen.
Die Firma BP beispielsweise berechnet damit sowohl statische Notwendigkeiten von Bohrinseln wie aus Quartalsbilanzen oder den Wassergehalt im Golf von Mexiko.
kkboy94
kkboy94 01.07.2010 um 21:39:37 Uhr
Goto Top
Danke jetzt funktionierts einwandfrei.
Einen kleinen Fehler hab ich noch entdeckt in Zeile 16.
Müsste doch eigentlichso sein:
goto :eof 

Und was bedeutet die Tilde in der Schleife?
Hat das nicht normalerweise was mit dem Überspringen von Zeichen oder sowas zu tun? (Offset)
for /f "tokens=1,2,3 delims=." %%a in ("%~1") do set ipa=%%a.%%b.%%c. 
22.
echo %ipa% 

MfG Karsten
Biber
Biber 01.07.2010 um 21:52:00 Uhr
Goto Top
Moin kkboy,

mit der Zeile 16 hast du natürlich Recht... wie geschrieben, ich hab auch nur grob durchgeharkt und nicht getestet.

Ändere ich auch NICHT in der Skizze oben.
Und was bedeutet die Tilde in der Schleife?

Ja, diese Antwort ist ein bisschen versteckt in den "Befehl /?"-Hilfen am CMD-Prompt.

In der Hilfe zu CALL ("call /?") steht es beispielsweise:
Call /?
....

    Die Ersetzung von Batchparametern (%n) wurde erweitert. Sie können
    jetzt folgende Syntax benutzen:

        %~1         - Expandiert %1 und entfernt umschließende
                      Anführungszeichen (").
....

Mehr Geheimnis verbirgt sich nicht dahinter...
... aber wenn man/frau es nicht zufällig irgendwo in einem Batch gelesen hat, sucht/kennt es auch niemand.

Hier im konkreten Schnipsel ist es eher überflüssig, aber es kommt bei mir auch automatisch,
wenn ich explizit einen Parameter in Anführungszeichen setze (wie in der FOR-Anweisungs-Klammer),
dass ich dann evtl. ohnehin vorhandene Anführungszeichen abschäle.

Grüße
Biber

P.S. Frittenbudendeutsch hab ich vorhin noch vergessen bei den Sprachen.
kkboy94
kkboy94 01.07.2010 um 21:58:04 Uhr
Goto Top
Wenn ich das also richtig verstanden habe, kann man parameter auch ohne Anführungszeichen machen und bracuht dann auch keine Tilde?


Ich will auch Frittenbudendeutsch können face-big-smile face-big-smile
Biber
Biber 01.07.2010 um 22:09:42 Uhr
Goto Top
Moin kkboy94,

Zitat von @kkboy94:
Wenn ich das also richtig verstanden habe, kann man parameter auch ohne Anführungszeichen machen und bracuht dann auch keine Tilde?
Äh... ja. Kann sein. Dazu müsste ich jetzt die Frage verstehen...

Probier es einfach aus am CMD-Prompt, was wann passiert.
>for /f "tokens=1, 3" %i in ("eins zwei "drei" undVier") do @echo %i %~i "%~i" %j %~j "%~j"
eins eins "eins" "drei" drei "drei"

Ich will auch Frittenbudendeutsch können face-big-smile face-big-smile
Ist nicht so schwierig wie der Oldenburger-Platt-Compiler, den ich mal gebaut habe.

Grüße
Biber
kkboy94
kkboy94 01.07.2010 um 22:17:22 Uhr
Goto Top
Gut habs soweit verstanden, aber wo bleibt die 4 und die 2?
Biber
Biber 01.07.2010 um 22:20:27 Uhr
Goto Top
Zitat von @kkboy94:
Gut habs soweit verstanden, aber wo bleibt die 4 und die 2?
Der erste Teilsatz schließt eigentlich den Teil nach dem Komma aus face-wink

Die eine Zeile knackst du....

Grüße
Biber
kkboy94
kkboy94 02.07.2010 um 22:04:31 Uhr
Goto Top
Yippie ich habs verstanden.

So nochne Frage dran:

ist es möglich in diesem teil , die Sache so umzuschreiben, dass %%i keine Zahlen angibt sondern den dazugehörigen netzwerkadapter?
for /f "tokens=1,3 delims=:" %%i in ('ipconfig/all^|findstr "IP-Ad"^|findstr /n $') do (   
11.
       echo. IP%%i=%%j

MfG Karsten
Biber
Biber 04.07.2010 um 13:05:45 Uhr
Goto Top
Moin kkboy94,

sagen wir so: wenn du in der Ausgabe von "IPConfig /all" alle Zeilen mit dem zugehörigen Netzwerkadapter identifizieren kannst, dann ja.

Im Moment fieselst du ja alle IP-Zeilen raus, weil du die Zeilen auf den String "IP-Ad" prüfst.
Also beim originalen Windows "IP-Address<blah>" findest , beim deutschen Windows entsprechend "IP-Adresse<bla>".

Und durch "Findstr /n" kommt die "erste" IP-Adresse noch eine "1:" vorweg, die zweite eine "2." etc.

Könntest du natürlich genauso mit den Zeilen machen, die die Netzwerkadapterinformation enthalten und dann zusammenmischen.

Mach mal einfach einen Vorschlag, was deine "Netzwerkadapter"-Zeilen gemeinsam bzw. als Identifikationsmerkmal haben.

Bei meinen Rechnern steht das auf dünnem Eis ...mit Glück steht das Wort "Adapter" in der Zeile und ebenso mit Glück hat die Zeile nur einen ":" (im Gegensatz zu allen anderen, die haben zwei Token bei "Delims=:".

Grüße
Biber
kkboy94
kkboy94 04.07.2010 um 13:45:51 Uhr
Goto Top
Moin zurück

Also:
Bei mir steht dann immer der Adapter, und dann welche Verbindung das ist. Bsp.:

Ethernetadapter LAN-Verbindung:

Ip-Adresse
Standardgateway
DNS-Server
usw...


Wiw filter ich denn in dem Beispiel den Adapter raus?

Grüße zurück
Biber
Biber 04.07.2010 um 14:21:12 Uhr
Goto Top
Moin kkboy94,

Wiw filter ich denn in dem Beispiel den Adapter raus?
Ich weiss, es ist wieder ziemlich warm heute.
Aber ich habe mich eigentlich bemüht, entsprechende Tipps & Strategien so in meinem Kommentar zu verstecken, dass sie auch gefunden werden könnten.

Obwohl... manchmal verschätz ich mich bei so etwas.
Ich hab beispielsweise im Jahr 1993 zu Ostern Schokoladen-Eier versteckt, die werden vielleicht erst von künftigen Generationen gefunden.

Bitte lies noch mal meinen Kommentar.

Wenn du es bis morgen nicht knackst, dann turn ich es vor.

Grüße
Biber
kkboy94
kkboy94 04.07.2010 um 14:42:59 Uhr
Goto Top
Tada-->
Demo am CMD-Prompt
>for /f "tokens=1 delims=:" %a in ('ipconfig/all^|findstr "adap"') do @echo %a  
Ethernetadapter LAN-Verbindung

So nach 3 Min hatte ichs. Durch diese Forum werd ich immer besser

Danke für den HiddenHint ^^

EDIT:
Jetzt wollte ich das in die vorhandene Batch einbauen. Das sah dann so aus:
echo Deine IP-Adressen sind 
for /f "tokens=1,3 delims=:" %%i in ('ipconfig/all^|findstr "IP-Ad"^|(for /f "tokens=1 delims=:" %%a in ('ipconfig/all^|findstr "adap"') do echo %%a)') do (  
      echo. IP%%i=%%j
       rem hier wird die oben herausgefundene IP für den weiter unten beschriebenen Vorgang "vorbereitet"  
      Call :test %%j
) 
Mir wird dann aber folgendes gesagt:
Deine IP-Adressen sind
"|" ist syntaktisch an dieser Stelle nicht verarbeitbar.
IP%i=%j
Jetzt weiß ich aber nicht was ich da falsch gemacht habe
MfG Karsten