(Teil-)Strings in for-Schleife bearbeiten
Hallo,
einen String "AAA;BBB;CCC;DDD" möchte ich in die Token "AAA", "BBB", "CCC" und "DDD" zerlegen lassen und auf jeden dieser Token ein Kommando ausführen lassen. Mein Code:
set "x=AAA;BBB;CCC;DDD"
for /F "delims=;" %%i in ("%x%") do echo test & echo %%i
Offenbar wird die Schleife nur einmal durchlaufen, test und %%i werden nur einmal ausgegeben. Die Zerlegung an sich funktioniert, mit "tokens=2" kann ich bspw. "BBB" referenzieren. "tokens=*" packt mir den gesamten String in i. Was ich haben möchte (test-Ausgabe beiseite):
AAA
BBB
CCC
DDD
Wenn diese Token nun Pfade sind, also bspw. statt "AAA" "c:\testverzeichnis\testunterverzeichnis" - wie extrahiere ich aus dem Token den Pfad ohne den Laufwerksbuchstaben, einmal mit führendem Backslash, einmal ohne, also "\testverzeichnis\testunterverzeichnis" und "testverzeichnis\testunterverzeichnis"?
Wie könnte ich den Namen des in der Pfadhierarchie am tiefsten gelegenen Verzeichnisses extrahieren, hier also "testunterverzeichnis"?
Für Hilfe wäre ich sehr dankbar.
Viele Grüße
Lena
Batch-Dummie
einen String "AAA;BBB;CCC;DDD" möchte ich in die Token "AAA", "BBB", "CCC" und "DDD" zerlegen lassen und auf jeden dieser Token ein Kommando ausführen lassen. Mein Code:
set "x=AAA;BBB;CCC;DDD"
for /F "delims=;" %%i in ("%x%") do echo test & echo %%i
Offenbar wird die Schleife nur einmal durchlaufen, test und %%i werden nur einmal ausgegeben. Die Zerlegung an sich funktioniert, mit "tokens=2" kann ich bspw. "BBB" referenzieren. "tokens=*" packt mir den gesamten String in i. Was ich haben möchte (test-Ausgabe beiseite):
AAA
BBB
CCC
DDD
Wenn diese Token nun Pfade sind, also bspw. statt "AAA" "c:\testverzeichnis\testunterverzeichnis" - wie extrahiere ich aus dem Token den Pfad ohne den Laufwerksbuchstaben, einmal mit führendem Backslash, einmal ohne, also "\testverzeichnis\testunterverzeichnis" und "testverzeichnis\testunterverzeichnis"?
Wie könnte ich den Namen des in der Pfadhierarchie am tiefsten gelegenen Verzeichnisses extrahieren, hier also "testunterverzeichnis"?
Für Hilfe wäre ich sehr dankbar.
Viele Grüße
Lena
Batch-Dummie
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 107737
Url: https://administrator.de/forum/teil-strings-in-for-schleife-bearbeiten-107737.html
Ausgedruckt am: 21.04.2025 um 13:04 Uhr
11 Kommentare
Neuester Kommentar
Hallo lenchenx und willkommen im Forum!
Da Du offensichtlich für jedes Token ohnehin (einen) eigene(n) Arbeitsschritt(e) vorhast, gleich die Variante mit je einem Schleifendurchlauf pro Pfad und Verarbeitung in einem Unterprogramm:
Info: "for /?" (ziemlich am Ende)
Grüße
bastla
[Edit] @miniversum: Mit der Kurzfassung wäre ich auch schon früher fertig gewesen ...
[/Edit]
[Edit2] Ergänzung: Vor dem Kürzen von %Pfad2% wird geprüft, ob dies überhaupt erforderlich ist [/Edit2]
Offenbar wird die Schleife nur einmal durchlaufen, test und %%i werden nur einmal ausgegeben.
Das liegt einfach daran, dass Du (wegen des "/f") nur eine Zeile zerlegst - dafür erhältst Du aber auch %%j, %%k und %%l (wenn Du "tokens=1-4" angibst) ...Da Du offensichtlich für jedes Token ohnehin (einen) eigene(n) Arbeitsschritt(e) vorhast, gleich die Variante mit je einem Schleifendurchlauf pro Pfad und Verarbeitung in einem Unterprogramm:
@echo off & setlocal
set "x=AAA;BBB;CCC;DDD"
for %%i in (%x%) do call :ProcessPath "%%~i"
goto :eof
:ProcessPath
set "Pfad=%~1"
set "Pfad1=%~pnx1"
set "Pfad2=%Pfad1%"
if "%Pfad2:~,1%"=="\" set "Pfad2=%Pfad2:~1%
set "Pfad3=%~nx1"
echo %~1
echo %Pfad1%
echo %Pfad2%
echo %Pfad3%
goto :eof
Grüße
bastla
[Edit] @miniversum: Mit der Kurzfassung wäre ich auch schon früher fertig gewesen ...
[Edit2] Ergänzung: Vor dem Kürzen von %Pfad2% wird geprüft, ob dies überhaupt erforderlich ist [/Edit2]
Hallo lenchenx!
Um das Trennen am Leerzeichen zu verhindern, müssten die einzelnen Pfade unter Anführungszeichen gesetzt werden.
Alternative (wenn fest steht, dass es 4 Pfade sind):
Grüße
bastla
[Edit] "tokens=1-4" nachgetragen [/Edit]
Um das Trennen am Leerzeichen zu verhindern, müssten die einzelnen Pfade unter Anführungszeichen gesetzt werden.
Alternative (wenn fest steht, dass es 4 Pfade sind):
@echo off & setlocal
set "x=AAA;BBB;CCC;DDD"
for /f "tokens=1-4 delims=;" %%i in ("%x%") do call :ProcessAll "%%i" "%%j" "%%k" "%%l"
goto :eof
:ProcessAll
for %%i in (%*) do call :ProcessPath "%%~i"
goto :eof
:ProcessPath
set "Pfad=%~1"
set "Pfad1=%~pnx1"
set "Pfad2=%Pfad1%"
if "%Pfad2:~,1%"=="\" set "Pfad2=%Pfad2:~1%
set "Pfad3=%~nx1"
echo %~1
echo %Pfad1%
echo %Pfad2%
echo %Pfad3%
goto :eof
bastla
[Edit] "tokens=1-4" nachgetragen [/Edit]
Hallo lenchenx!
Auf die Schnelle ein Ansatz, mit dem sich allerdings sicher kein Schönheitspreis gewinnen lässt:
In Zeile 4 war ich ein wenig schreibfaul - "%%d" bis "%%y" kannst Du aber sicherlich selbst eintragen ... 
Grüße
bastla
Auf die Schnelle ein Ansatz, mit dem sich allerdings sicher kein Schönheitspreis gewinnen lässt:
@echo off & setlocal
set "x=AAA;BBB;CCC;DDD"
for /f "tokens=1-26 delims=;" %%a in ("%x%") do call :ProcessAll "%%a" "%%b" "%%c" ... "%%z"
goto :eof
:ProcessAll
for %%i in (%*) do call :ProcessPath "%%~i"
goto :eof
:ProcessPath
set "Pfad=%~1"
if "%Pfad:~1,1%"=="" goto :eof
set "Pfad1=%~pnx1"
set "Pfad2=%Pfad1%"
if "%Pfad2:~,1%"=="\" set "Pfad2=%Pfad2:~1%
set "Pfad3=%~nx1"
echo %~1
echo %Pfad1%
echo %Pfad2%
echo %Pfad3%
echo\
goto :eof
Grüße
bastla
... so gefiele es mir dann doch besser
:
Dass %x% nicht mit einem ";" beginnt oder endet habe ich einfach vorausgesetzt ...
Grüße
bastla
@echo off & setlocal
set "x=AAA;BBB;CCC;DDD"
for %%i in ("%x:;=";"%") do call :ProcessPath %%i
goto :eof
:ProcessPath
set "Pfad=%~1"
if "%Pfad:~1,1%"=="" goto :eof
set "Pfad1=%~pnx1"
set "Pfad2=%Pfad1%"
if "%Pfad2:~,1%"=="\" set "Pfad2=%Pfad2:~1%
set "Pfad3=%~nx1"
echo %~1
echo %Pfad1%
echo %Pfad2%
echo %Pfad3%
echo\
goto :eof
Grüße
bastla
Hallo lenchenx!

Damit alle Pfade zwischen Anführungszeichen stehen, muss
- zunächst ein Anführungszeichen an den Anfang gesetzt, dann
- jedes Trennzeichen von (nur) Semikolon auf Anführungszeichen Semikolon Anführungszeichen umgewandelt und
- noch ein Anführungszeichen an das Ende gesetzt werden.
So wird aus
dann eben
Das Ersetzen in einem String kannst Du übrigens unter "set /?" nachlesen.
Grüße
bastla
Und was tut sich da alles zwischen den Klammern bei ("%x:;=";"%")?
Gar nicht so viel ... Damit alle Pfade zwischen Anführungszeichen stehen, muss
- zunächst ein Anführungszeichen an den Anfang gesetzt, dann
- jedes Trennzeichen von (nur) Semikolon auf Anführungszeichen Semikolon Anführungszeichen umgewandelt und
- noch ein Anführungszeichen an das Ende gesetzt werden.
So wird aus
AAA;BBB;CCC;DDD
"AAA";"BBB";"CCC";"DDD"
Grüße
bastla