Programmieren - alles kontrollieren 4.932 Themen, 20.605 Beiträge

Windows Batch: REM wird ignoriert - so ein Wahnsinn!

gerhard38 / 0 Antworten / Flachansicht Nickles

Mein Verständnis, was eine Kommentarzeile ist, wurde schwer erschüttert. Nach meinem Verständnis wird alles, was hinter dem Kommentarzeichen (wie dieses aussieht, ist abhängig von der Programmiersprache) kommt, vom Command-Interpreter, Parser, Compiler etc. ignoriert. Das ist ja, m. E. auch der Sinn eines Kommentars in einem Programm. In meinen Programmen sind meist sehr viele Kommentare, auch auskommentierter Code mit Anmerkungen, Verweis auf Quellen etc.

Machte gestern jedoch folgende Entdeckung: ein kleines Batch-Programm "pdfrename.bat" unter W732EN sollte mir PDF-Dateien in einem Verzeichnis so umbenennen, dass der Dateiname beliebiger Länge um den String " OdB" erweitert wird. Hatte dazu ein Muster, wie es vom Command-prompt abgesetzt werden kann. Nach permanentem Misserfolg mit dem kompletten Programm blieben nach Eingrenzung auf die Fehlerstelle drei Zeilen übrig: eine Kommentarzeile mit dem Datum, eine Kommentarzeile mit dem Muster-Befehl, wie er am Commandprompt zu verwenden ist, und in der Folgezeile der von mir gewünschte Befehl, der ausgeführt werden sollte.

  REM Rework 2020-12-16
REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa"
for %%F in (*.pdf) do ren "%%~F" "%%~nF OdB%%~xF"

Das Programm stürzt mit Fehlermeldung in Bezug auf die 2., auskommentierte Zeile

  Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters 
ist ungültig: %~na version 1%~xa"
[...]

was ich erst nach einiger Zeit mitkriegte, denn NIE hätte ich nach Fehlerhaftem Code in einer Kommentarzeile gesucht.

Habe das daher bei "Superuser" gepostet und war gespannt.

Es kamen schnell qualifizierte Antworten mit dem Ergebnis, dass alles mit rechten Dingen zugeht: Der Command-Interpreter / Parser schaut zuerst alles an, und erst in Phase 2 schaut er nach, ob da Zeilen auskommentiert sind:

"REM would be processed in phase 2 of the parser, but it never gets there as the % processing in phase 1 has already generated an error and terminated the parsing."

Eine weiterer lichtvoller Hinweis: REM ist gar kein Kennzeichen für eine Kommentarzeile, sondern ein Befehl, der einfach nichts tut:

"To add to the existing answers, although REM is used for comments, it is important to understand that it is actually a command that does nothing, not a comment".

Mit anderen Worten: "it's no bug, it's a feature" das aber leider - m:E.n - im Widerspruch mit den Erwartungen an die Bedeutung einer Kommentarzeile und sämtlichen mir bekannten Tutorials hinsichtlich der Bedeutung von Kommentarzeilen und auch von "REM" steht. Sogar auf der MS-Seite  rem | Microsoft Docs (abgerufen 2020-12-16) steht kein Wort davon, da heißt es

rem [<comment>] 

<comment> Specifies a string of characters to include as a comment.

Keinerlei Andeutung, dass der "string of characters" gegebenenfalls trotz REM davor an dieser Stelle, also für den Fall, dass REM fehlen sollte, funktionierender Code sein muss.

Gruß, Gerhard

Das ganze kann im Detail hier windows - Why "REM " is ignored? - Super User nachgelesen werden. 

bei Antwort benachrichtigen