'' No se reconoce como un comando interno o externo

25

Cuando ejecuto ciertos archivos (principalmente lotes) usando PsExec, obtengo estos extraños símbolos '' 'antes de mi comando. Mi pensamiento inicial fue que estaba usando una codificación incorrecta, pero después de verificar, me di cuenta de que todos mis archivos estaban usando UTF-8.

miestasmia
fuente
¿Por qué no convertirlos a UTF-16LE en su lugar?
Ignacio Vázquez-Abrams
¿Cual es la diferencia?
miestasmia
La diferencia es que Windows generalmente no usa UTF-8.
Ignacio Vázquez-Abrams

Respuestas:

32

Recibo estos extraños símbolos '' 'antes de mi comando [...] todos mis archivos estaban usando UTF-8.

Esto tiene dos causas:

  1. cmd.exe no es compatible con UTF-8. Siempre usa una de las codificaciones de un solo byte a menudo llamada "OEM": cp437, cp775, etc., dependiendo de la configuración regional del sistema.

    (Esperaba que también admitiera UTF-16, pero aparentemente no; ni siquiera si agregué la lista de materiales UTF-16).

  2. Su editor de texto está agregando una "marca de orden de bytes" (bytes EF BB BF) UTF-8 al comienzo de todos los archivos UTF-8.

    Cuando cmd.exe lee su script, no sabe qué hacer con la marca: ve la lista de materiales como tres caracteres cp437 comunes e intenta usarlos como parte del nombre del comando.

Configure su editor para que deje de agregar la lista de materiales a los archivos codificados con UTF-8. (Solo tiene sentido en UTF-16, y es muy inútil en UTF-8).

¿Compilar los archivos por lotes en un exe resolvería el problema?

eh

qué

usuario1686
fuente
3
No diría que las listas de materiales son "muy inútiles" en UTF-8; aunque están en este caso particular. Muchas aplicaciones los usan para determinar que el texto en realidad es UTF-8 y no otra codificación.
Dour High Arch
19

Para ampliar la respuesta de @ dsolimano , si está utilizando específicamente Visual Studio , y en mi caso es 2013 , lo solucioné haciendo lo siguiente:

  1. Abra Visual Studio .
  2. Haz clic en Herramientas > Opciones .
  3. Haga clic en Editor de texto > Extensión de archivo .
  4. En el cuadro Extensión , ingrese bat .
  5. En el menú desplegable Editor , seleccione Editor de código fuente (texto) con codificación y haga clic en Agregar .
  6. Haga clic en Aceptar para guardar y salir.

Ahora, cuando abra un archivo .bat desde Visual Studio , inicialmente se le solicitará:

ingrese la descripción de la imagen aquí

Deberá desglosar las opciones hasta llegar a la opción DOS de su idioma:

ingrese la descripción de la imagen aquí

Haga clic en Aceptar para terminar de abrir el archivo.


De acuerdo, aunque debería ser bastante obvio en este punto, si puede ver los ∩╗┐caracteres al comienzo de su archivo, le conviene eliminarlos y guardar el archivo, ahora con la codificación correcta. Esto es lo que evita que se te vuelva a preguntar la próxima vez.


Con todo eso en su lugar, le alegrará saber que ahora puede ver , editar y guardar sus archivos .bat desde Visual Studio para que cmd.exe ya no le brinde el atroz error antes mencionado de:

'' no se reconoce como un comando interno o externo, programa operativo o archivo por lotes.

Code Maverick
fuente
2
Esta solución también funciona perfectamente en VS2017
Greg Trevellick
1
Nunca hubiera adivinado esto. Sigue siendo una solución válida para VS2019.
hbulens
10

Esas son marcas de orden de bytes Unicode . Cmd.exe no los entiende. Si vuelve a guardar sus archivos en el Bloc de notas con codificación ANSI, eso debería solucionar el problema.

Por ejemplo, creé este archivo por lotes:

echo Hello World

Primero lo guardo con codificación 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.

Luego con 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.

Y finalmente con ANSI

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

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

Como se explicó anteriormente, este carácter es el carácter unicode BOM (marca de orden de bytes) utilizado como firma y que cmd.exe no reconoce.

Puede eliminarlo de manera segura de muchas maneras.

He encontrado muy fácil hacer lo siguiente:

  1. abre el archivo en Notepad ++
  2. ir al menú de codificación
  3. marque la opción: Codificar en UTF-8 sin BOM
  4. Ahorre, y eso es todo.
Sabri
fuente