For-Schleife: Ausrufezeichen in Dateinamen
Schönen guten Tag!
Dieses Skript:
...funktioniert sehr gut, ignoriert aber bei der Erstellung der DIR.pls alle "!" (Ausrufezeichen) in Dateinamen, so daß dann beim Abspielen im MPC ein falscher, nicht existierender Dateiname vorkommt und entsprechend ignoriert wird. Bei der zuerst erstellten DIR.txt dagegen sind die "!" und somit alle Dateien noch enthalten.
Übrigens: "!" ist das einzige Sonderzeichen, das dieses Problem macht.
Alle anderen innerhalb von Dateinamen ( °§$%&[()]=#@+-_;' - sauber durchgetestet ) funktionieren problemlos, erstaunlicherweise sogar das "%".
Ich weiß, "!" ist an dieser Stelle ein Skript-Funktionszeichen, um im Gegensatz zu "%" die Routine zu verzögern.
Ersetze ich beide !count! probehalber durch %count%, dann funktioniert alles genauso, und aber mit dem gleichen Fehler. Kein Unterschied.
Frage: Läßt sich das irgendwie ändern/umgehen?
Oder ist das eine absolute Grenze dieser alten Skriptsprache, und ich sollte deshalb auf "!" in relevanten Dateinamen verzichten?
Wenn ja, mit welchem Skript neuerer Art würde das problemlos funktionieren?
Danke, Grüße,
Artemis
Dieses Skript:
@echo off
chcp 1252
dir *.mp4 /A-D /S /OGN /B > dir.txt
chcp 850
setlocal ENABLEDELAYEDEXPANSION
set count=0
REM Alle Zeilen nummerieren und dann bei der Ausgabe vor jede Zeile "File" schreiben
FOR /F "tokens=* delims=" %%A IN (DIR.txt) DO (
set /a count=!count!+1
echo File!count!=%%A >> DIR.pls
)
endlocal
...funktioniert sehr gut, ignoriert aber bei der Erstellung der DIR.pls alle "!" (Ausrufezeichen) in Dateinamen, so daß dann beim Abspielen im MPC ein falscher, nicht existierender Dateiname vorkommt und entsprechend ignoriert wird. Bei der zuerst erstellten DIR.txt dagegen sind die "!" und somit alle Dateien noch enthalten.
Übrigens: "!" ist das einzige Sonderzeichen, das dieses Problem macht.
Alle anderen innerhalb von Dateinamen ( °§$%&[()]=#@+-_;' - sauber durchgetestet ) funktionieren problemlos, erstaunlicherweise sogar das "%".
Ich weiß, "!" ist an dieser Stelle ein Skript-Funktionszeichen, um im Gegensatz zu "%" die Routine zu verzögern.
Ersetze ich beide !count! probehalber durch %count%, dann funktioniert alles genauso, und aber mit dem gleichen Fehler. Kein Unterschied.
Frage: Läßt sich das irgendwie ändern/umgehen?
Oder ist das eine absolute Grenze dieser alten Skriptsprache, und ich sollte deshalb auf "!" in relevanten Dateinamen verzichten?
Wenn ja, mit welchem Skript neuerer Art würde das problemlos funktionieren?
Danke, Grüße,
Artemis
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 660652
Url: https://administrator.de/contentid/660652
Ausgedruckt am: 05.11.2024 um 12:11 Uhr
5 Kommentare
Neuester Kommentar
Moin,
Es gäbe aber in deinem Fall dennoch auch noch zwei andere Wege:
1) einfach die Variablenverzögerung ausgeschaltet lassen.
So hast du erst gar kein Problem mit den Ausrufezeichen. Um dann aber dennoch die richtigen Variablenwerte zu erhalten, musst du einen Bereich außerhalb der For-Schleife Callen
Hat das eigentlich einen speziellen Grund, wieso du die Dateien erst in eine TXT-Datei exportieren lässt, statt den Befehl direkt in der For-Schleife auszuführen?
Noch als kleiner Hinweis: "Tokens=*" und "Delims=" erfüllen beide den selben Zweck. Eines von beiden zu verwenden wäre also bereits vollkommen ausreichend.
2) Findstr kann Textdateien auch direkt nummeriert ausgeben
Gruß Thomas
Zitat von @Artemis:
Obwohl das Ganze dann per Skript (Batch) erledigt wird, ist es aber doch recht umständlich.
Deswegen ist Batch ja eigentlich auch längst tot.Obwohl das Ganze dann per Skript (Batch) erledigt wird, ist es aber doch recht umständlich.
Es gäbe aber in deinem Fall dennoch auch noch zwei andere Wege:
1) einfach die Variablenverzögerung ausgeschaltet lassen.
So hast du erst gar kein Problem mit den Ausrufezeichen. Um dann aber dennoch die richtigen Variablenwerte zu erhalten, musst du einen Bereich außerhalb der For-Schleife Callen
@echo off
chcp 1252
dir *.mp4 /A-D /S /OGN /B > dir.txt
chcp 850
set count=0
FOR /F "tokens=* delims=" %%A IN (DIR.txt) DO Call :Nummerieren "%%A"
goto :EoF
:Nummerieren
set /a count+=1
echo File%count%=%~1 >> DIR.pls
Noch als kleiner Hinweis: "Tokens=*" und "Delims=" erfüllen beide den selben Zweck. Eines von beiden zu verwenden wäre also bereits vollkommen ausreichend.
2) Findstr kann Textdateien auch direkt nummeriert ausgeben
FOR /F "tokens=1,* delims=:" %%A IN ('findstr /x /v /n * DIR.txt') DO (
echo File%%A=%%B >> DIR.pls
)
Gruß Thomas