alexf001
Goto Top

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!

Content-Key: 54371

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: bastla
bastla Mar 18, 2007, updated at Oct 18, 2012 at 16:31:45 (UTC)
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]
Member: alexf001
alexf001 Mar 18, 2007 at 21:37:30 (UTC)
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!!!
Member: bastla
bastla Mar 18, 2007 at 23:04:18 (UTC)
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
Mitglied: 45426
45426 Mar 18, 2007 at 23:10:53 (UTC)
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.
Mitglied: 45426
45426 Mar 18, 2007 at 23:11:09 (UTC)
Goto Top
--einmal piepen reicht-- MfG Biber
Member: Biber
Biber Mar 19, 2007 at 07:01:00 (UTC)
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
Member: alexf001
alexf001 Mar 19, 2007 at 15:06:20 (UTC)
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!
Mitglied: 45426
45426 Mar 19, 2007 at 15:23:14 (UTC)
Goto Top
doppelt.
Mitglied: 45426
45426 Mar 19, 2007 at 15:23:57 (UTC)
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.) ;)
Member: alexf001
alexf001 Mar 19, 2007 at 15:28:10 (UTC)
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