Strings schneiden in %%i bei For-schleife Noobi
Hallo.
habe seit einiger Zeit versucht paar Kleinigkeiten in Windows-shell zu realisieren, da mich unser Prof ankotzt, der der Meinung ist Windows=Mist, Linux=Lösung für alles!
Paar Fragen:
1. Wieso kann ich in der shell bei einer For-schleife %i benutzen,
aber in einer bat-datei geht es nur mit %%i ?
2. wenn ich einfach so
3. dann dachte ich einfach:
wieso ich sowas mach:
habe oft eine größere anzahl an dateien die irgendwelche "blöde" zusätze im namen haben. (z.B. Serien)
nun wollte ich die davon befreien.
für den fall dass ab einen bestimmten zeichen abgeschnitten werden soll habe ich hinbekommen,
aber bei einer bestimmten position noch nicht.
danke im voraus!
habe seit einiger Zeit versucht paar Kleinigkeiten in Windows-shell zu realisieren, da mich unser Prof ankotzt, der der Meinung ist Windows=Mist, Linux=Lösung für alles!
Paar Fragen:
1. Wieso kann ich in der shell bei einer For-schleife %i benutzen,
aber in einer bat-datei geht es nur mit %%i ?
2. wenn ich einfach so
set i=%i:~0,5%
eingebe funktioniert das ausschneiden, aber wenn ich for /F %%i in ('dir /b') do echo %i:~3,5%
eintippee nicht?! ==> :~3,5% wird an den dateiname angehängt123_datei.txt:~3,5%
asdfas_test1.bat:~3,5%
cvncv_test2.bat:~3,5%
gsdgsdh_test.bmp:~3,5%
asdfas_test1.bat:~3,5%
cvncv_test2.bat:~3,5%
gsdgsdh_test.bmp:~3,5%
3. dann dachte ich einfach:
for /F %%i in ('dir /b') do ^
set temp=%%i & echo %temp:~3,5%
==> ausschneiden funktioniert, aber die Variable temp hat immer den letzten wert (denselben)!set temp=%%i & echo %temp:~3,5%
gsdh
gsdh
gsdh
gsdh
gsdh
gsdh
gsdh
wieso ich sowas mach:
habe oft eine größere anzahl an dateien die irgendwelche "blöde" zusätze im namen haben. (z.B. Serien)
nun wollte ich die davon befreien.
für den fall dass ab einen bestimmten zeichen abgeschnitten werden soll habe ich hinbekommen,
aber bei einer bestimmten position noch nicht.
danke im voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 54371
Url: https://administrator.de/forum/strings-schneiden-in-i-bei-for-schleife-noobi-54371.html
Ausgedruckt am: 18.05.2025 um 16:05 Uhr
10 Kommentare
Neuester Kommentar
Hallo alexf001 und willkommen im Forum!
Bis Biber die Details nachreicht:
zu 2.
"Einfach so" ist %i% eine "gewöhnliche" Variable, in einer "for"-Schleife ist %%i eine Laufvariable mit besonderen Eigenschaften - Lösung: Hast Du, wie 3. zeigt, schon gefunden; alternativ (für umfangreichere Bearbeitung) bietet sich noch ein
an - damit wird ein Unterprogramm aufgerufen und %%i (zur Sicherheit innerhalb von Anführungszeichen) als Argument übergeben. Damit der Batch nicht irrtümlich in das Unterprogramm läuft, sollte dieses mit einem
übersprungen oder das Hauptprogramm mit einem
abgeschlossen werden.
Im Unterprogramm (das mit der Zeile
beginnt) erhältst Du den Wert von %%i mit %~1 (durch "~" wieder ohne Anführungszeichen) zur weiteren Bearbeitung - damit umgehst Du auch das Problem wie bei 3., da bis zum Rücksprung aus dem Unterprogramm die "for"-Schleife verlassen wird. Das Unterprogramm beendest Du mit einem
zu 3.
Bei "for"-Schleifen werden Variablenwerte nur einmal ausgewertet - Lösung: DelayedExpansion einschalten
und beim Auslesen statt %temp% !temp! schreiben - dazu gibt's hier im Forum massenhaft Beispiele.
Schematisch ergeben sich also folgende Varianten:
(konkretes Beispiel dazu erst neulich) oder
Anmerkung: Die "set"-Schreibweise mit dem Anführungszeichen vor dem Variablennamen soll sicherstellen, dass auch Variableninhalte mit Leerstellen komplett in die neue Variable übernommen werden - die Anführungszeichen selbst werden dabei nicht Inhalt der neuen Variablen.
Weitere Anmerkung: Den Variablennamen %temp% habe ich zur Bezugnahme auf Dein Beispiel belassen - an sich solltest Du einen anderen Namen wählen, da %TEMP% und %TMP% defaultmäßig als Systemvariable auf den aktuellen Temp-Pfad verweisen.
Grüße
bastla
P.S.: Ob Du mit Deinen obigen Erkenntnissen Deinen Prof widerlegen kannst ...
[Edit] "Weitere Anmerkung" hinzugefügt [/Edit]
Bis Biber die Details nachreicht:
zu 2.
"Einfach so" ist %i% eine "gewöhnliche" Variable, in einer "for"-Schleife ist %%i eine Laufvariable mit besonderen Eigenschaften - Lösung: Hast Du, wie 3. zeigt, schon gefunden; alternativ (für umfangreichere Bearbeitung) bietet sich noch ein
for /f "delims=" %%i in ('dir /b') do call :ProcessFile "%%i"
goto :WeiterUnten
goto :eof
Im Unterprogramm (das mit der Zeile
:ProcessFile
goto :eof
Bei "for"-Schleifen werden Variablenwerte nur einmal ausgewertet - Lösung: DelayedExpansion einschalten
setlocal enabledelayedexpansion
Schematisch ergeben sich also folgende Varianten:
for /f "delims=" %%i in ('dir /b') do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set "temp=%~1"
echo %temp:~3,5%
goto :eof
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b') do set "temp=%%i" & echo !temp:~3,5!
Weitere Anmerkung: Den Variablennamen %temp% habe ich zur Bezugnahme auf Dein Beispiel belassen - an sich solltest Du einen anderen Namen wählen, da %TEMP% und %TMP% defaultmäßig als Systemvariable auf den aktuellen Temp-Pfad verweisen.
für den fall dass ab einen bestimmten zeichen abgeschnitten werden soll habe ich hinbekommen, aber bei einer bestimmten position noch nicht.
Was meinst Du mit "bestimmter Position"?Grüße
bastla
P.S.: Ob Du mit Deinen obigen Erkenntnissen Deinen Prof widerlegen kannst ...
[Edit] "Weitere Anmerkung" hinzugefügt [/Edit]
Hallo alexf001!
Zur Formatierung (ganz versteckt in den FAQ
): siehe auch Link im Kommentareingabefenster ...
Hier wird zunächst %Pos% und danach (verzögert) !String! aufgelöst.
Hinweis: Das Beispiel nicht von der Commandline, sondern als Batch ausführen.
Variabel:
Grüße
bastla
Zur Formatierung (ganz versteckt in den FAQ
wo kann man genaueres zu umramung mit !...! nachlesen?
In der Hilfe zu "set"; dort findest Du auch zusätzlich noch Informationen zur Stringzerlegung (nach Deinem Beispiel oben war ich davon ausgegangen, Du hättest Dich schon näher damit beschäftigt) - dazu ergänzend ein Beispiel mit variabler Position:setlocal enabledelayedexpansion
set Pos=10
set "String=NurbisZehnundnichtweiter"
echo !String:~0,%Pos%!
Hinweis: Das Beispiel nicht von der Commandline, sondern als Batch ausführen.
gibt es andere möglichkeit ohne:
setlocal enabledelayedexpansion
und
rumspriengen mit goto?
AFAIK nicht in Batch - außer ev das Ersetzen von Text bei der Ausgabe von Variablen (aber nur mit konstantem Ersatz-Text, ansonsten ist auch dafür DelayedExpansion erforderlich) - Beispiele:setlocal enabledelayedexpansion
und
rumspriengen mit goto?
set "String=DelayedExpansion brauchen wir nicht oft"
echo %String%
echo %String:nicht=sehr%
echo %String:nicht =%
setlocal enabledelayedexpansion
set "Ersatz=wirklich sehr"
set "String=DelayedExpansion brauchen wir nicht oft"
echo %String%
echo !String:nicht=%Ersatz%!
Grüße
bastla

1. Wieso kann ich in der shell bei einer For-schleife %i benutzen,
aber in einer bat-datei geht es nur mit %%i ?
aber in einer bat-datei geht es nur mit %%i ?
Weil das seit ewigen Zeiten die Vorgaben sind. Das war schon in Uralt-Dos-Versionen eine Bedingung.
Auszug aus der Windows-Hilfe:
{%Variable|%%Variable}
... Stellt einen ersetzbaren Parameter dar. Verwenden Sie %Variable, wenn Sie den Befehl for über die Eingabeaufforderung ausführen möchten. Verwenden Sie %%Variable, wenn Sie den Befehl for in einer Batchdatei ausführen möchten. Variablen berücksichtigen Groß-/Kleinschreibung und müssen durch einen Alphawert, z. B. %A, %B oder %C, dargestellt werden.

--einmal piepen reicht-- MfG Biber
Moin alexf001,
Fussnote zu bastla's geduldigen Ausführungen und Deinen Fragen:
Ein Beispiel:
Und was die Aussage Deines Profs betrifft:
Das ist natürlich so nicht haltbar.
Richtig muss es heißen:
Windows=Bockmist, Unix=Lösung für alles!
Gruss
Biber
Fussnote zu bastla's geduldigen Ausführungen und Deinen Fragen:
gibt es andere möglichkeit ohne:
setlocal enabledelayedexpansion
und rumspriengen mit goto?
Klar. Die von Dir scherzhaft "Windows-Shell" genannte CMD.exe kommt doch aus dem Land der unbegrenzten Möglichkeiten...setlocal enabledelayedexpansion
und rumspriengen mit goto?
Ein Beispiel:
::NoobiDemo.bat
@echo off & setlocal
set Pos=10
set "String=NurbisZehnundnichtweiter"
call echo %%String:~0,%Pos%%%
Und was die Aussage Deines Profs betrifft:
...der der Meinung ist Windows=Mist, Linux=Lösung für alles!
Das ist natürlich so nicht haltbar.
Richtig muss es heißen:
Windows=Bockmist, Unix=Lösung für alles!
Gruss
Biber

doppelt.

Zu 1.) Jede Sprache, auch eine Scriptsprache verlangt eine bestimmte Syntax, die einzuhalten ist. Es ist müßig, darüber zu diskutieren, warum, wieso und weswegen das so ist. Es ist halt so.
zu 2.) Weil die Stringbearbeitung in vorgegebener Form nur für den SET-Befehl vorgesehen ist, nicht für FOR und auch nicht für ECHO, siehe 1.)
3.) siehe 2.) ;)
zu 2.) Weil die Stringbearbeitung in vorgegebener Form nur für den SET-Befehl vorgesehen ist, nicht für FOR und auch nicht für ECHO, siehe 1.)
3.) siehe 2.) ;)