alexf001

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
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ängt
123_datei.txt:~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)!
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!
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

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

bastla
bastla 18.03.2007, aktualisiert am 18.10.2012 um 18:31:45 Uhr
Goto Top
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
for /f "delims=" %%i in ('dir /b') do call :ProcessFile "%%i"  
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
goto :WeiterUnten
übersprungen oder das Hauptprogramm mit einem
goto :eof
abgeschlossen werden.
Im Unterprogramm (das mit der Zeile
:ProcessFile
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
goto :eof
zu 3.
Bei "for"-Schleifen werden Variablenwerte nur einmal ausgewertet - Lösung: DelayedExpansion einschalten
setlocal enabledelayedexpansion
und beim Auslesen statt %temp% !temp! schreiben - dazu gibt's hier im Forum massenhaft Beispiele.
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
(konkretes Beispiel dazu erst neulich) oder
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b') do set "temp=%%i" & echo !temp:~3,5!  
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.
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 ... face-wink

[Edit] "Weitere Anmerkung" hinzugefügt [/Edit]
alexf001
alexf001 18.03.2007 um 22:37:30 Uhr
Goto Top
meine lösung für abschneiden nach einen bestimmten zeiche:
for /F %%i in ('dir /b') do ^
for /F "delims=_ tokens=2" %%j in ("%%i") do ren %%i %%j

p.s. html-tag funktionieren hier nicht?! wie verwendest du "code-schnipsel"?
wo kann man genaueres zu umramung mit !...! nachlesen?
gibt es andere möglichkeit ohne:
setlocal enabledelayedexpansion
und
rumspriengen mit goto?

danke schonmal!!!
bastla
bastla 19.03.2007 um 00:04:18 Uhr
Goto Top
Hallo alexf001!

Zur Formatierung (ganz versteckt in den FAQ face-wink): siehe auch Link im Kommentareingabefenster ...

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%!
Hier wird zunächst %Pos% und danach (verzögert) !String! aufgelöst.
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:
set "String=DelayedExpansion brauchen wir nicht oft"  
echo %String%
echo %String:nicht=sehr%
echo %String:nicht =%
Variabel:
setlocal enabledelayedexpansion
set "Ersatz=wirklich sehr"  
set "String=DelayedExpansion brauchen wir nicht oft"  
echo %String%
echo !String:nicht=%Ersatz%!

Grüße
bastla
45426
45426 19.03.2007 um 00:10:53 Uhr
Goto Top
1. Wieso kann ich in der shell bei einer For-schleife %i benutzen,
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.
45426
45426 19.03.2007 um 00:11:09 Uhr
Goto Top
--einmal piepen reicht-- MfG Biber
Biber
Biber 19.03.2007 um 08:01:00 Uhr
Goto Top
Moin alexf001,

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

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
alexf001
alexf001 19.03.2007 um 16:06:20 Uhr
Goto Top
aslo um auf eine punkt zu kommen und nicht immer drum herum mit 1000 beispielen ;) :

zu 1): ist so! weil ist so!?
zu 2) keine antwort überhaupt????
zu 3) entweder
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b') do set "temp=%%i" & echo !temp:~3,5!
oder rumspringen mit goto!

p.s.
::NoobiDemo.bat
@echo off & setlocal
set Pos=10
set "String=NurbisZehnundnichtweiter"
call echo %%String:~0,%Pos%%%
hilft mir nicht weiter, siehe frage 2!
45426
45426 19.03.2007 um 16:23:14 Uhr
Goto Top
doppelt.
45426
45426 19.03.2007 um 16:23:57 Uhr
Goto Top
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.) ;)
alexf001
alexf001 19.03.2007 um 16:28:10 Uhr
Goto Top
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.)

also ohne set kann ich nicht im text ausschneiden?!
schade face-sad