artemis
Goto Top

For-Schleife: Ausrufezeichen in Dateinamen

Schönen guten Tag!

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

Content-ID: 660652

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

Ausgedruckt am: 05.11.2024 um 12:11 Uhr

MichaelW84
MichaelW84 09.03.2021 aktualisiert um 21:34:36 Uhr
Goto Top
Du könntest probieren die dir txt vorher probe halber mit einem notepad++ zu editieren.

Und zwar ersetzt du jedes ! Gegen ^^! Dann könnte es klappen.

Habe es jetzt aber nicht getestet.

Wenn es klappt kannst du das ersetzen auch in der bat machen.
Artemis
Artemis 09.03.2021 aktualisiert um 22:23:49 Uhr
Goto Top
Gute Idee, danke!
Wird sicher funktionieren (egal womit ich austausche, z.B. auch mit "Feuerwehr" face-smile ),
... und dann in der DIR.pls wieder rücktauschen.

Obwohl das Ganze dann per Skript (Batch) erledigt wird, ist es aber doch recht umständlich.
Wie der Affe, der sich mit der falschen Hand am anderen Kopfende kratzt.

Zumal ich das Ding über ein Buttonbar-Icon im TC im jeweiligen Verzeichnis sehr häufig aufrufe, auch für kleinere Dateisammlungen. Es geht also nicht darum, einmalig 20.000 files zu bearbeiten (das wäre kein Problem, kann man verschieden lösen), sondern um andauernde Praxis, die auch noch in mehrere weitere Vorgänge eingebunden ist.
Zwar wäre der Zeitverlust bei dieser Umständlichkeit tolerierbar, aber besser wäre es allemal, einen direkten gradlinigen Weg zu haben. Ist so eine Macke von mir, Skripte, besonders Makros, schlank und effizient zu halten. Wie beim Bruch-Kürzen in der Schule face-wink

Würde mich also sehr freuen, wenn jemand eine Zeile mit einem Zauberknopf in mein Skript einfügen könnte.
Ginge es evtl. mit einer VBS-Routine?

Artemis
MichaelW84
MichaelW84 09.03.2021 um 23:39:31 Uhr
Goto Top
Naja das ^^ vor dem Ausrufezeichen sorgt dafür das das! Als Text interpretiert wird.
Du könntest deine Textdatei einlesen und gleichzeitig überall das! Ersetzen dann hast du das korrekte Ergebnis.

Händisch sollte man das nur mal zum testen machen.
TK1987
Lösung TK1987 10.03.2021 aktualisiert um 12:13:42 Uhr
Goto Top
Moin,

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.

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 
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
FOR /F "tokens=1,* delims=:" %%A IN ('findstr /x /v /n * DIR.txt') DO (   
    echo File%%A=%%B >> DIR.pls 
) 

Gruß Thomas
Artemis
Artemis 11.03.2021 um 05:09:07 Uhr
Goto Top
Hallo Thomas,
Deine Variante 2) ist genial: einfach, präzise, schnell.
Vielen Dank!
Artemis