raidman
Goto Top

Mehrere Strings in FOR Schleife abarbeiten ohne eine Datei zu lesen

Hallo Kenner und Könner face-smile

ich möchte in einer FOR Schleife 8 verschiedene Strings (*.ext) unter der selben Variablen abarbeiten,
normalerweise würde man jetzt wohl zB eine "string.txt" erzeugen und Die dann zeilenweise auslesen
in etwa so
FOR /F "tokens=*" %%a IN (string.txt) do (  
echo %%a
)
pause

ich möchte das selbe Verhalten erreichen allerdings ohne eine Datei lesen zu müssen,
sondern die strings sollen in der Batch datei definiert werden

FOR /F "tokens=1-5 delims=;" %%a IN ("*.ex1;*.ex2;*.ex3;*.ex4;*.ex5") do (  
echo %%a
)
pause
funktioniert leider nicht weil jede ext eine eigene Variable wird

Die Frage ist nun kommt man überhaupt ohne Hilfsdatei aus, wenn ja wie?

und schon mal danke fürs lesen

Gruß
RaidMan

Content-ID: 213362

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

Ausgedruckt am: 16.11.2024 um 11:11 Uhr

bastla
bastla 05.08.2013 aktualisiert um 11:10:44 Uhr
Goto Top
Hallo Raidman!

Was soll denn danach mit den einzelnen Strings passieren? Wegen des "*" würden die Strings in einer "for" (ohne "/f")-Schleife als Suchmuster für Dateien interpretiert werden ...

Grüße
bastla
colinardo
colinardo 05.08.2013 um 11:09:56 Uhr
Goto Top
Hallo RaidMan,
z.B. so:
@echo off & setlocal ENABLEDELAYEDEXPANSION
set NL=^


set "string=*.ex1!NL!*.ex2!NL!*.ex3!NL!*.ex4!NL!*.ex5"  
for /f "tokens=* delims=" %%k in ("!string!") DO @(  
	echo %%k
)

Grüße Uwe
bastla
bastla 05.08.2013 um 11:26:16 Uhr
Goto Top
@ colinardo
Clever ... face-smile

Grüße
bastla
RaidMan
RaidMan 05.08.2013 um 11:26:26 Uhr
Goto Top
Hallo bastla

danke für die schnelle Antwort könnte schon die Lösung sein
würde jede einzelne String einen Durchlauf generieren oder einen gemeinsamen?
muss ich gleich mal test

es soll im weiteren tatsächlich nach den Strings gesucht bzw auf vorhandensein solcher Dateien geprüft werden
if exist "path"\%%a   

RaidMan
bastla
bastla 05.08.2013 aktualisiert um 23:22:34 Uhr
Goto Top
Hallo RaidMan!

Wenn es ohnehin um die Dateien geht, kannst Du ja gleich
for %%a in ("path\*.ext1" "path\*.ext2" "path\*.ext3") do (  
   echo Verarbeite "%%a"  
)
verwenden ...

... oder, falls auch noch mehrere Pfade gefragt sind und verschachtelt werden soll, einfach nur die einzelnen Extensions in der Schleife angeben (ungetestet):
for %%e in (ext1 ext2 ext3) do (
   for %%f in ("path1\*.%%e" "path2\*.%%e" "path3\*.%%e") do (  
       echo Verarbeite "%%f"  
    )
)
Grüße
bastla

[Edit] "Schachtel"-Variante hinzugefügt [/Edit]
RaidMan
RaidMan 05.08.2013 aktualisiert um 11:36:08 Uhr
Goto Top
Hallo Uwe

auch Dir dank für den Quicky face-smile

sieht auf den ersten Blick genau danach aus was ich erreichen wollte
nur ist grad ne Nummer zu hoch für mich

was ist set NL=^

und war da nicht was mit set funktioniert nicht richtig in FOR Schleifen
aber das wird mit ENABLEDELAYEDEXPANSION korigiert ?

RaidMan
colinardo
colinardo 05.08.2013 aktualisiert um 11:43:15 Uhr
Goto Top
Zitat von @RaidMan:
was ist set NL=^
das ist ein Zeilenumbruch (die zwei Leerzeilen danach müssen so bleiben, die gehören dazu). Dieser funktioniert nur im Zusammenhang mit "delayed expansion". Dieser trennt dann deine einzelnen Strings mit Zeilenumbrüchen !NL! voneinander.
Weitere Erläuterungen zu Delayed Expansion findest du hier , das musste ich leider schon zu oft runterbeeten face-wink.
Endoro
Endoro 05.08.2013 um 12:38:27 Uhr
Goto Top
Hi,
@ECHO OFF &SETLOCAL
FOR %%a IN (
	.ex1
	.ex2
	.ex3
	.ex4
	.ex5
	) DO (
  IF EXIST "mypath\*%%a" ECHO %%a exists.  
)
.. just my 2ct face-smile
112778
112778 05.08.2013 aktualisiert um 17:10:17 Uhr
Goto Top
Zitat von @bastla:
@ colinardo
Clever ... face-smile


Hi,

wieso clever? Clever ist an dem NL-Trick imo nichts.

Warum in die Ferne schweifen und mit teils abenteuerlichen Lösungen aufwarten, die selten jemand versteht?
Unter Windows gibt es die Registry, die alle Werte für das Environment erzeugt und in der man eigene Variablen unterbringen kann, die dann nach dem Start des OS oder nach Änderung in den Einstellungen in der Systemsteuerung für das Environment sofort zur Verfügung stehen.
Allerdings muss vorher die Konsole geschlossen werden, da das alte Environment sonst bis zum erneuten Öffnen der Konsole noch gültig bleibt.
Für Spezialzeichen bietet sich der Typ REG_EXPAND_SZ geradezu an. Die in der Registry eingetragnen Variablen bleiben auch dauerhaft so lange erhalten, bis man sie wieder löscht. face-smile

Spezialzeichen_ins_Environment_eintragen.reg
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"NL"=hex(2):0d,0a,00  
"CR"=hex(2):0d,00  
"LF"=hex(2):0a,00  
"TAB"=hex(2):09,00  
"BS"=hex(2):20,08,08,00  
"BELL"=hex(2):07,00  


Nur für die nächsten 3 ist SETLOCAL ENABLEDELAYEDEXPANSION und das "!" erforderlich, die anderen funktionierten auch ohne die verzögerte Variablenverabeitung und mit "%".
CR = Wagenrücklauf, bleibt in der Zeile
LF = Zeilenvorschub
NL = Neue Zeile (CR+LF)
bS = Backspace/Rücktaste
TAB = TAbulator
BELL = Piepton, falls der Dienst "BEEP" und ein Lautsprecher aktiv sind


Und die TEST.CMD dazu zum Testen:
::Test für Spezialzeichen
@echo off & setlocal ENABLEDELAYEDEXPANSION
echo bla !LF!!LF!bla
echo bla !NL!!NL!blubber
echo bla !CR!blubb
@echo 1234567%BS%%BS%2
echo bla%TAB%bla%TAB%blubb
Pause

Gruß
bastla
bastla 05.08.2013 um 17:07:43 Uhr
Goto Top
@ EisPott
wieso clever?
Bezog sich auf das Trennen der Einzelstrings durch Zeilenschaltungen - fandest Du die Idee nicht gut?

Grüße
bastla
112778
112778 05.08.2013 aktualisiert um 23:23:18 Uhr
Goto Top
Die Trennung durch Zeilenschaltungen ist schon ok und gut, meine Kritik bezog sich lediglich auf das Tricksen mit der Erzeugung der Zeilenschaltung. face-smile
AlbertMinrich
AlbertMinrich 05.08.2013 um 23:02:43 Uhr
Goto Top
Zitat von @RaidMan:
Hallo Kenner und Könner face-smile

ich möchte in einer FOR Schleife 8 verschiedene Strings (*.ext) unter der selben Variablen abarbeiten,
normalerweise würde man jetzt wohl zB eine "string.txt" erzeugen und Die dann zeilenweise auslesen
in etwa so
> FOR /F "tokens=*" %%a IN (string.txt) do (  
> echo %%a
> )
> pause
> 

ich möchte das selbe Verhalten erreichen allerdings ohne eine Datei lesen zu müssen,
sondern die strings sollen in der Batch datei definiert werden

> FOR /F "tokens=1-5 delims=;" %%a IN ("*.ex1;*.ex2;*.ex3;*.ex4;*.ex5") do (  
> echo %%a
> )
> pause
> 
funktioniert leider nicht weil jede ext eine eigene Variable wird



Kann es sein, daß du einfach nur sowas willst:
for %%i in (bli,bla,blu) do echo %%i
Endoro
Endoro 05.08.2013 um 23:19:28 Uhr
Goto Top
Zitat von @AlbertMinrich:
Kann es sein, daß du einfach nur sowas willst:
for %%i in (bli,bla,blu) do echo %%i
ja, genauso isses .
Und wenn du statt Komma einen line break machst, erhälst du die oben von mir gepostete Schleife face-smile
lg.
bastla
bastla 05.08.2013 um 23:24:18 Uhr
Goto Top
... und bei Leerzeichen etwas in der Art wie noch weiter oben ... face-wink

Grüße
bastla
RaidMan
RaidMan 06.08.2013 aktualisiert um 09:49:39 Uhr
Goto Top
Moin Leutz

hehehe hier wird man ja echt gepampert face-smile
ich bin noch an experimentieren wie es am besten funktioniert
(es tauchen leider immer neue Unschönheiten in der Batch auf)

Aber für mich als Batch-Bastler ist die Variante von Endore ersteinmal am übersichtlichsten
@ECHO OFF &SETLOCAL
FOR %%a IN (
	.ex1
	.ex2
	.ex3
	.ex4
	.ex5
	) DO (
  IF EXIST "mypath\*%%a" ECHO %%a exists.  
)

in der fertigen Batch wuerde ich dann wohl die Variante von AlberMinrich anwenden
for %%i in (bli,bla,blu) do echo %%i
da die auf eine Zeile passt

allerbesten Dank an Alle

RaidMan