Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Inkrementierung in For-Schleife bleibt aus

Frage Entwicklung Batch & Shell

Mitglied: StoppelHoppel

StoppelHoppel (Level 1) - Jetzt verbinden

01.07.2013 um 22:26 Uhr, 1303 Aufrufe, 11 Kommentare, 5 Danke

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
Mitglied: rubberman
01.07.2013, aktualisiert um 23:00 Uhr
Hallo StoppelHoppel, willkommen im Forum.

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

01.
@echo off  
02.
set /a "zaehler=1" 
03.
set "pfad=%cd%" 
04.
set "suffix=.jpg" 
05.
for /f "delims=" %%d in ('dir *%suffix% /a-d /b') do ( 
06.
  set "file=%%d" 
07.
  setlocal EnableDelayedExpansion 
08.
  echo !file! 
09.
  echo !pfad!\!zaehler!!suffix! 
10.
  endlocal 
11.
  set /a "zaehler += 1" 
12.
13.
pause
Grüße
rubberman

EDIT: siehe bastla
Bitte warten ..
Mitglied: bastla
01.07.2013, aktualisiert um 22:46 Uhr
... wobei ich allerdings
for /f "delims=" %%d in ('dir *%suffix% /b') do (
hybscher fände ...

... und für die Übervorsichtigen unter uns:
for /f "delims=" %%d in ('dir *%suffix% /b/a-d') do (
Grüße
bastla
Bitte warten ..
Mitglied: rubberman
01.07.2013, aktualisiert um 23:04 Uhr
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 ...

Grüße
rubberman
Bitte warten ..
Mitglied: StoppelHoppel
02.07.2013 um 01:52 Uhr
Danke für den freundlichen Empfang und die prompte Hilfestellung

@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
Bitte warten ..
Mitglied: bastla
02.07.2013 um 08:33 Uhr
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
Bitte warten ..
Mitglied: rubberman
02.07.2013 um 09:42 Uhr
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

Grüße
rubberman
Bitte warten ..
Mitglied: StoppelHoppel
02.07.2013 um 14:20 Uhr
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:

01.
02.
03.
set file=!file: =?! 
04.
rename !pfad!\!file! !zaehler!!suffix! 
05.
06.
.
Schönen Tag und Gruß vom
Hoppel
Bitte warten ..
Mitglied: bastla
02.07.2013 um 14:44 Uhr
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
Bitte warten ..
Mitglied: StoppelHoppel
02.07.2013 um 16:03 Uhr
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

Danke und Gruß
Hoppel
Bitte warten ..
Mitglied: bastla
02.07.2013 um 17:46 Uhr
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
Bitte warten ..
Mitglied: StoppelHoppel
02.07.2013 um 19:21 Uhr
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

Danke und Gruß
Hoppel
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...