stoppelhoppel
Goto Top

Inkrementierung in For-Schleife bleibt aus

Hallo Leute, ich bin hier neu und ein batchnoob:

Die in einem gegebenen Verzeichnis vorhandenen .jpgs sollen fortlaufend und mit 1 beginnend umbenannt werden (1.jpg, 2.jpg, 3.jpg ...). dir /b im Testverzeichnis zeigt:
batch.bat
Hallo.jpg
Neues RTF-Dokument.rtf
Neues Textdokument.txt
OpenDocument Zeichnung (neu).odg
temp.txt
test_2.jpg
test_3.jpg


Da die Sache mit 'rename' das nächste Level zu sein scheint, wage ich mich vorerst an den aktuellen 'Endgegner': der Inkremator ;) - und beschränke mich auf 'echo':
@echo off
set /a zaehler=1
set pfad=%cd%
set suffix=.jpg
for /f "tokens=*" %%d in ('dir *jpg /b') do echo %pfad%\%zaehler%%suffix% & set /a zaehler=%zaehler%+1
pause

das ergibt folgende Ausgabe:
E:\test4Bat\1.jpg
E:\test4Bat\1.jpg
E:\test4Bat\1.jpg

Erkennbar ist, das die Formulierung soweit stimmt ( es werden 3 Dateien gefunden und der Pfad, der später in 'rename' verwendet werden soll, wird zusammen gesetzt - nur der Inhalt von 'Zaehler' nicht erhöht. Dies ist auch bei der Verwendung von Klammern im 'for' Teil der Fall.

Ginge es nur um wenige Dateien - es wäre närrisch diesen Aufwand zu betreiben. Aber ein häufig wiederkehrendes Aufkommen von mehreren hundert pics in einem Ordner ohne Unterverzeichnisse wollte ich eben auf diese Art lösen. Über Hinweise, auch hinsichtlich der Absicht, 'rename' mit diesem String-Ding zu füttern, wäre ich froh.

Viele Grüße

Content-Key: 208926

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

Printed on: April 19, 2024 at 11:04 o'clock

Member: rubberman
rubberman Jul 01, 2013 updated at 21:00:59 (UTC)
Goto Top
Hallo StoppelHoppel, willkommen im Forum.

Du benötigst die "verzögerte Variablenerweiterung" um Änderungen innerhalb einer Kommandozeile oder eines Blocks greifbar zu machen.

@echo off 
set /a "zaehler=1"  
set "pfad=%cd%"  
set "suffix=.jpg"  
for /f "delims=" %%d in ('dir *%suffix% /a-d /b') do (  
  set "file=%%d"  
  setlocal EnableDelayedExpansion
  echo !file!
  echo !pfad!\!zaehler!!suffix!
  endlocal
  set /a "zaehler += 1"  
)
pause

Grüße
rubberman

EDIT: siehe bastla face-wink
Member: bastla
bastla Jul 01, 2013 updated at 20:46:20 (UTC)
Goto Top
... wobei ich allerdings
for /f "delims=" %%d in ('dir *%suffix% /b') do (
hybscher fände ... face-wink

... und für die Übervorsichtigen unter uns:
for /f "delims=" %%d in ('dir *%suffix% /b/a-d') do (
Grüße
bastla
Member: rubberman
rubberman Jul 01, 2013 updated at 21:04:21 (UTC)
Goto Top
Hallo bastla,

normalerweise bin ich ja immer hybsch und ybervorsichtig. Da das Thema DelayedExpansion nun aber in jedem fünften Beitrag behandelt wird, scheint es so als würde ich nachlässig. Aber ich mach's mal noch hybscher ... face-wink

Grüße
rubberman
Member: StoppelHoppel
StoppelHoppel Jul 01, 2013 at 23:52:58 (UTC)
Goto Top
Danke für den freundlichen Empfang und die prompte Hilfestellung face-smile

@rubberman: Ehrlich gesagt bin ich über den Gegenstand "verzögerte Variablenerweiterung" einige Male gestolpert, kam aber aufgrund mangelnden Durchblicks nicht auf die Idee, das hier der Hase im Pfeffer liegt. Ich werde darüber lesen müssen. Variablenbelegung in "" zwecks Eindeutigkeit betr. Leerzeichen?

@bastla: Sind mit "delims=" Trennzeichen 'ausgeschaltet' bzw. werden nicht gesucht? /a-d ist wirklich sicherer, allerdings gibt's definitiv keine Unterverzeichnisse

Funktioniert prima. Auch die vorgelagerte Ausgabe des im nächsten Schritt zu verwurstenden Dateinamens ist zweckmäßig. Danke Euch.

Gruß vom Hoppel
Member: bastla
bastla Jul 02, 2013 at 06:33:58 (UTC)
Goto Top
Hallo StoppelHoppel!
Sind mit "delims=" Trennzeichen 'ausgeschaltet' bzw. werden nicht gesucht?
Yep - damit erhältst Du den kompletten Dateinamen inkl Typ; ohne Angabe eines (bzw hier explizit keines) Delimiters würde defaultmäßig anhand von Leerzeichen getrennt werden.

Grüße
bastla
Member: rubberman
rubberman Jul 02, 2013 at 07:42:17 (UTC)
Goto Top
Hallo StoppelHoppel.

Variablenbelegung in "" zwecks Eindeutigkeit betr. Leerzeichen?
Unter anderem. Es schützt dich auch vor Sonderzeichen, bspw. &.
Wenn du anschließend die Pfade/Dateinamen per RENAME verwurstest, schadet es auch nie wenn du Anführungszeichen setzen würdest face-wink

Grüße
rubberman
Member: StoppelHoppel
StoppelHoppel Jul 02, 2013 at 12:20:19 (UTC)
Goto Top
Hallo.

Nachtrag: 'Rename' zu zähmen war ungleich leichter. Einzig der Fall mit Leerzeichen im Dateinamen machte - wie Ihr sagen werdet - erwartungsgemäß Schwierigkeiten ;). Gelöst habe ich es mit:

<code = "plain">
.
.
set file=!file: =?!
rename !pfad!\!file! !zaehler!!suffix!
.
.


Schönen Tag und Gruß vom
Hoppel
Member: bastla
bastla Jul 02, 2013 at 12:44:12 (UTC)
Goto Top
Hallo StoppelHoppel!

Das wäre ja genau der Fall, den rubberman gemeint hat - und daher hätte
ren "!pfad!\!file!" !zaehler!!suffix!
genügt ...

Grüße
bastla
Member: StoppelHoppel
StoppelHoppel Jul 02, 2013 at 14:03:05 (UTC)
Goto Top
Hallo Bastla!

Ich bitte um Nachsicht ;) - aber ich habe das Problem ausschließlich bei den zu setzenden '?' gesucht ... werden die dann intern automatisch gesetzt? Bedeutet das ferner, dass mit dem Gebrauch von "" so etwas wie 'Syntaxsensitivität' hergestellt wird?

btw: interessant, den Weg über
: =?
entdeckt zu haben

Toller Support, funktioniert jetzt dank Deines Hinweis' auch mit Blanks im Verzeichnisnamen face-smile

Danke und Gruß
Hoppel
Member: bastla
bastla Jul 02, 2013 at 15:46:40 (UTC)
Goto Top
Hallo StoppelHoppel!
Bedeutet das ferner, dass mit dem Gebrauch von "" so etwas wie 'Syntaxsensitivität' hergestellt wird?
Den Begriff müsstest Du erst erklären ...

Mit den Anführungszeichen werden Pfad-/Dateinamen mit enthaltenen Leerzeichen "zusammengehalten", da das Leerzeichen nicht nur (zusammen mit TAB) Default-Delimiter in der for-Schleife, sondern auch Trennzeichen zwischen Batch-Befehlen / -Argumenten ist.

Weiterer Vorteil der Verwendung von Anführungszeichen: Wie von rubberman auch schon angesprochen können so die Sonderzeichen "<|>&" als "gewöhnliche" Zeichen in Strings ("&" auch in Pfad-/Dateinamen) verwendet werden.

Grüße
bastla
Member: StoppelHoppel
StoppelHoppel Jul 02, 2013 at 17:21:03 (UTC)
Goto Top
Hallo bastla!

Ich erspare Euch besser die Beschreibung meiner Wortschöpfung ...
Ich habe das mehrfach Wiederholte wohl verstanden und die .bat tut, was sie soll face-smile

Danke und Gruß
Hoppel