́╗┐ 'n'est pas reconnu comme une commande interne ou externe

25

Lors de l'exécution de certains fichiers (principalement par lots) à l'aide de PsExec, j'obtiens ces symboles étranges avant ma commande. Ma pensée initiale était que j'utilisais un mauvais encodage, mais après vérification, j'ai réalisé que tous mes fichiers utilisaient UTF-8.

miestasmie
la source
Pourquoi ne pas les convertir en UTF-16LE à la place?
Ignacio Vazquez-Abrams
Quelle est la différence?
miestasmia
La différence est que Windows n'utilise généralement pas UTF-8.
Ignacio Vazquez-Abrams

Réponses:

32

J'obtiens ces symboles bizarres avant ma commande […] tous mes fichiers utilisaient UTF-8.

Cela a deux causes:

  1. cmd.exe ne prend pas en charge UTF-8. Il utilise toujours l'un des codages à un octet souvent appelé «OEM» - cp437, cp775, etc., selon les paramètres régionaux du système.

    (Je m'attendais à ce qu'il prenne également en charge l'UTF-16, mais apparemment pas; pas même si j'ai ajouté la nomenclature UTF-16.)

  2. Votre éditeur de texte ajoute une "marque d'ordre d'octets" UTF-8 (octets EF BB BF) au début de tous les fichiers UTF-8.

    Lorsque cmd.exe lit votre script, il ne sait pas quoi faire de la marque - il voit la nomenclature comme trois caractères cp437 ordinaires et tente de les utiliser dans le nom de la commande.

Configurez votre éditeur pour arrêter l'ajout de la nomenclature aux fichiers encodés en UTF-8. (Cela n'a de sens qu'en UTF-16 et est très inutile en UTF-8.)

La compilation des fichiers batch dans un exe résoudrait-elle le problème?

euh

quoi

user1686
la source
3
Je ne dirais pas que les nomenclatures sont "très inutiles" en UTF-8; bien qu'ils le soient dans ce cas particulier. De nombreuses applications les utilisent pour déterminer que le texte est réellement UTF-8 et non un autre encodage.
Dour High Arch
19

Pour approfondir la réponse de @ dsolimano , si vous utilisez spécifiquement Visual Studio , et dans mon cas c'est 2013 , je l'ai corrigé en procédant comme suit:

  1. Ouvrez Visual Studio .
  2. Cliquez sur Outils > Options .
  3. Cliquez sur Éditeur de texte > Extension de fichier .
  4. Dans la zone Extension , entrez bat .
  5. Dans la liste déroulante de l' éditeur , sélectionnez l' éditeur de code source (texte) avec codage et cliquez sur Ajouter .
  6. Cliquez sur OK pour enregistrer et quitter.

Maintenant, lorsque vous ouvrez un fichier .bat à partir de Visual Studio , vous serez initialement invité avec:

entrez la description de l'image ici

Vous souhaiterez explorer les options jusqu'à ce que vous arriviez à l' option DOS de votre langue:

entrez la description de l'image ici

Cliquez sur OK pour terminer l'ouverture du fichier.


Ok, même si cela devrait être assez évident à ce stade, si vous pouvez voir les ∩╗┐caractères au début de votre fichier, il vous incomberait de les supprimer et d'enregistrer le fichier, maintenant avec l'encodage correct. C'est ce qui vous empêche d'être invité à nouveau la prochaine fois.


Avec tout cela en place, vous serez heureux de savoir que vous pouvez maintenant afficher , modifier et enregistrer vos fichiers .bat à partir de Visual Studio afin que cmd.exe ne vous donne plus l'erreur odieuse susmentionnée de:

'' n'est pas reconnu comme une commande interne ou externe, un programme exploitable ou un fichier de commandes.

Code Maverick
la source
2
Ce correctif fonctionne également parfaitement dans VS2017
Greg Trevellick
1
Je n'aurais jamais deviné ça. Encore une solution valable pour VS2019.
hbulens
10

Ce sont des marques d'ordre d'octets Unicode . Cmd.exe ne les comprend pas. Si vous réenregistrez vos fichiers dans le Bloc-notes avec un codage ANSI, cela devrait résoudre le problème.

Par exemple, j'ai créé ce fichier batch:

echo Hello World

Je l'enregistre d'abord avec l'encodage UTF-8

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
'echo' is not recognized as an internal or external command,
operable program or batch file.

Puis avec Unicode

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>■e
'■e' is not recognized as an internal or external command,
operable program or batch file.

Et enfin avec ANSI

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World
dsolimano
la source
4

Comme expliqué précédemment, ce caractère est le caractère unicode BOM (Byte Order Mark) utilisé comme signature et que cmd.exe ne reconnaît pas.

Vous pouvez le supprimer en toute sécurité de plusieurs manières.

J'ai trouvé très facile à faire comme suit:

  1. ouvrir le fichier dans Notepad ++
  2. aller au menu Encodage
  3. cochez l'option: Encoder en UTF-8 sans BOM
  4. Économisez, et c'est tout.
Sabri
la source