web-dev-qa-db-fra.com

Pourquoi ce fichier de commandes échoue-t-il sur une ligne "REM"?

Je me réfère à question Ajouter un texte à la fin du nom de fichier (mais avant l'extension) à l'aide d'un fichier de commandes Comme j'ai le même problème. Utilisation de Windows 7 32 bits Enterprise (je sais, je sais ...) Avec toutes les mises à jour que j'ai écrites un minuscule fichier de lot pdfrename.bat Avec seulement trois lignes:

  1. un commentaire, commençant par REM et non Signe de continuation "cachée" Signe plus à droite de la ligne

  2. la commande proposée, collé-collé de la source comme fournie par @karan , a commenté avec REM

  3. la commande adoptée pour le lot (doubler le %):

    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"
    

Exécution de la commande (3.) à partir de l'invite de commande,

for %F in (*.pdf) do ren "%~F" "%~nF OdB%~xF"

fonctionne bien.

Mais exécutant tout le fichier de lot pdfrename.bat de l'explorateur Windows échoue. Exécuter le fichier de commandes de l'invite de commande pdfrename.bat Produit une erreur de syntaxe de message d'erreur:

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

Vous n'avez pas besoin de comprendre l'allemand. Le point important est que Le message d'erreur fait référence à la deuxième ligne commentée (2.), pas à la troisième ligne!

J'ai essayé de retaper REM, inséré un tabulateur après REM, inséré une seconde REM après le premier (REM REM ....), a inséré une troisième ligne après la seconde avec le même contenu et supprimé la deuxième ligne après - rien n'a changé: le fichier de commandes se termine à la deuxième ligne commentée avec une erreur de syntaxe. Dès que la deuxième ligne incriminée est éliminée du lot, le lot fonctionne bien.

J'ai cherché "Rem est ignoré", mais pas de chance, alors je posterai la question ici. Je n'ai jamais entendu parler ou expérimenté avant que le processeur de commandement essaie au moins d'analyser une ligne de sortie commentée - et dans le cas où il y a quelque chose qui ne va pas avec le code après le signe de commentaire qu'il terminait le script de lot.

36
gkln

Cela ne fonctionne pas car même s'il est "remarqué", il est évalué pour les substitutions et alors apparemment jeté.

Pour "lot" votre deuxième ligne est incorrecte et devrait lire

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"

Les corrections étant que les extensions de programmation par lots doivent avoir %% plutôt qu'un seul%.

11
Mokubai

Pour ajouter aux réponses existantes, bien que REM est utilisé pour des commentaires, il est important de comprendre qu'il s'agit d'une commande qui ne fait rien, pas un commentaire. Ceci est différent d'une coque UNIX, où vous avez de véritables commentaires et peut ajouter du texte arbitraire après un # personnage.

Non seulement les substituts sont évalués pour la commande REM, modifiez également les redirections. Abriez donc que la ligne suivante supprimera le contenu du fichier, car la commande REM ne produit aucune sortie, mais la sortie vide sera redirigée vers le fichier.

REM some_command > important_file

Edit

En tant que commentaire indiqué, cela n'est plus vrai pour les versions Windows modernes. Selon - https://stackoverflow.com/a/4095133/10765659 Il y a maintenant une manipulation spéciale de REM afin que les redirections ne soient pas exécutées, mais cette manipulation spéciale se produit trop tard pour faire REM Un vrai commentaire, car les substituts sont toujours évalués.

10
RalfFriedl