2009-09-15 39 views
45

Me gustaría tratar con el nombre de archivo que contiene caracteres extraños, como el é.Codificación de archivo por lotes

todo está funcionando bien en la cáscara:

C:\somedir\>ren -hélice hélice 

Sé que si pongo esta línea en un archivo .bat, obtengo el siguiente resultado:

C:\somedir\>ren -hÚlice hÚlice 

Ver? é ha sido reemplazado por Ú.

Lo mismo es cierto para la salida del comando. Si I dir algún directorio en el shell, la salida está bien. Si redirijo esta salida a un archivo, algunos caracteres se transforman.

Entonces, ¿cómo puedo decirle a cmd.exe cómo interpretar lo que aparece como un é en mi archivo por lotes, es realmente un é y no una Ú o una coma?

Entonces, ¿no hay forma de ejecutar un archivo .bat para dar una pista sobre la página de códigos en la que se escribió?

Respuesta

59

Debe guardar el archivo por lotes con la codificación OEM. Cómo hacer esto varía según su editor de texto. La codificación utilizada en ese caso también varía. Para las culturas occidentales, generalmente es CP850.

Los archivos por lotes y la codificación son dos cosas que no se gustan entre sí. Notarás que Unicode también es imposible de usar allí, desafortunadamente (aunque las variables de entorno lo manejen bien).

Como alternativa, puede configurar la consola para utilizar otra página de códigos:

chcp 1252 

debe hacer el truco. Al menos funcionó para mí aquí.

Cuando realiza la redirección de salida, como con dir, se aplican las mismas reglas. Se utiliza la página de códigos de la ventana de la consola. Puede usar el interruptor /u en cmd.exe para forzar la redirección de salida Unicode, lo que hace que los archivos resultantes estén en UTF-16.

En cuanto a las codificaciones y páginas de códigos en cmd.exe en general, también ven a esta pregunta:

EDIT: En cuanto a tu edición: No, cmd siempre asume que el archivo por lotes para ser escrito en la página de códigos predeterminada de la consola.Sin embargo, puede incluir fácilmente un chcp al comienzo del lote:

chcp 1252>NUL 
ren -hélice hélice 

Para que esto sea más robusto cuando se utiliza directamente desde la línea de comandos, es posible que desee memorizar la página de códigos de edad y restaurarla después:

@echo off 
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x 
chcp 1252>nul 
ren -hélice hélice 
chcp %cp%>nul 
+1

chcp funciona en .bat, incluso si el eco es incorrecto. Sin embargo, si hago chcp 1252 en la consola, y luego escribo test.bat, sigue siendo incorrecto ... – shodanex

+1

Por supuesto que está mal. 'type' no sabe nada acerca de la página de códigos, por lo que asume la que tiene configurada actualmente. Lo que hace 'chcp' en el lote es * cambiar * esa página de códigos, de ahí los diferentes resultados. Presenté esto más como una solución de todos modos. La solución correcta es guardar el archivo por lotes en la codificación correcta. – Joey

+0

de hecho, la "entrada" de caracteres y la "salida" de caracteres a la pantalla son dos cosas diferentes.Si cambio de la policía de la consola: chcp 850 seguido del tipo me da hÛlice chcp 1252 seguido por el tipo me da Hélice Parece que la página de códigos de la policía de trama predeterminado no se cambia por chcp – shodanex

1

creé el siguiente bloque, que puse al principio de mis archivos por lotes:

set Filename=%0 
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END 
    rem Converting code page from 1252 to 850. 
    rem My editors use 1252, my batch uses 850. 
    rem We create a converted -850.bat file, and then launch it. 
    set File850=%~n0-850.bat 
    PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%" 
    call %File850% 
    del %File850% 
    EXIT /b 0 
:CONVERT_CODEPAGE_END 
1

que estaba teniendo problemas con esto, y aquí está la solución que Fou Dakota del Norte. Encuentra el número decimal para el personaje que estás buscando en tu página de códigos actual.

Por ejemplo, estoy en la página de códigos 437 (chcp le dice), y quiero un signo de grado,. http://en.wikipedia.org/wiki/Code_page_437 me dice que el signo de grado es el número 248.

Luego encuentra el carácter Unicode con el mismo número.

El carácter Unicode en 248 (U + 00F8) es.

Si inserta el carácter Unicode en su secuencia de comandos por lotes, se mostrará en la consola como el carácter que desee.

así que mi archivo por lotes

echo 

impresiones

° 
-1

me importa alrededor de tres conceptos:

  1. salida de la consola de codificación

  2. Línea de comando interno Al codificación (que cambió con chcp)

  3. .bat Codificación de texto

El escenario más fácil para mí: me tendrá los dos primeros mencionados en la misma codificación, por ejemplo CP850, y voy a guardar mi .bat en esa misma codificación (en Notepad ++, menú codificaciónJuegos de caracteresEuropa occidentalOEM 850).

Pero supongamos que alguien me da una .bat en otro sistema de codificación, por ejemplo CP1252 (en Notepad ++, menú Codificación * → Juegos de caracteresEuropa occidentalde Windows-1252)

Entonces me gustaría cambiar la codificación interna de línea de comando, con chcp 1252.

Esto cambia la codificación que utiliza para hablar con otros procesos, ni el dispositivo de entrada ni la consola de salida.

Por lo tanto, mi instancia de línea de comandos efectivamente enviará caracteres en 1252 a través de su descriptor de archivo STDOUT, pero aparece texto agrupado cuando la consola los descodifica como 850 (é es Ú).

Entonces modifique el archivo de la siguiente manera:

@echo off 

perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));" 
ren -hlice hlice 

Primero gire ECHO fuera lo que los comandos no se genera de forma explícita a menos que con cualquiera de eco ... o perl -e "Imprimir ..."

entonces puse este texto modelo cada vez que necesito para demostrar algo

perl -e "uso Codificar QW/decodificación de codificación /;" -e "print encode ('cp850', decode ('cp1252', \" ren -hélice hélice \ n \ "));"

Sustituyo el texto real que mostraré para esto: ren -hélice hélice.

Y también podría necesitar sustituir mi codificación de consola para cp850 y otra codificación lateral para cp1252.

Y justo debajo pongo el comando deseado.

Rompí la línea problemática en la mitad de salida y la mitad real del comando.

  • La primera parte mía segura: la "e" se interpreta como una "E" por medio de transcodificación. Es necesario para todas las oraciones de salida ya que la consola y el archivo están en diferentes codificaciones.

  • El segundo, el comando real (murmurado con @echo off), sabiendo que tenemos la misma codificación tanto de chcp como del texto .bat es suficiente para asegurar una interpretación adecuada del carácter.

+0

Al menos brinde alguna explicación. – prajmus

0

tenía signos de esmalte en el código en R (por ejemplo. A, E, Z, Z, etc.) y tenía el problema durante la ejecución de este script R con archivos .bat (en el archivo de salida. Rout en lugar de esos signos había signos como%, &, # etc. y el código no se ejecutó hasta el final).

Mi solución:

  1. guión Guardar R con codificación: Archivo> Guardar con codificación> CP1250
  2. Ejecutar archivo .bat

Se trabajó para mí, pero si todavía hay el problema, intente usar las otras codificaciones.

Cuestiones relacionadas