batch file - script - chcp 65001 y un archivo.bat
run bat file from cmd (5)
Tengo un problema con el comando chcp 65001
en el shell de Windows.
Necesito generar una lista de archivos en una carpeta. Entonces ejecuté cmd.exe, mecanografié
cd folder
dir /B /O:N > list_of_files.txt
Funcionó, pero tuve un problema con los caracteres especiales, no ASCII que están en algunos nombres de archivo. Así que agregué chcp 65001
Todo funcionó, pero cuando puse estos comandos en un archivo .bat, el script no funciona.
Asi que
cd folder
chcp 65001
dir /B /O:N > list_of_files.txt
no genera la lista.
y
cd folder
chcp 65001 && dir /B /O:N > list_of_files.txt
tanto como
cd folder
chcp 65001 > nul && dir /B /O:N > list_of_files.txt
genera la lista, pero con la codificación predeterminada: /.
Todo funciona en cmd.exe, pero no en archivos .bat.
He leído el tema: stackoverflow.com/questions/2182568/batch-script-is-not-executed-if-chcp-was-llamado , pero no ayudó.
EDITAR: chcp 65001
parcialmente mi problema, cambiando chcp 65001
a chcp 1250
porque todos los caracteres estaban en esta codificación. Pero en realidad esto no responde la pregunta.
Probado únicamente en Windows 7, puede no funcionar en Windows Vista.
Aparentemente chcp
no afecta directamente a dir
.
Analiza la salida de dir
e imprime a través de echo
:
chcp 65001
>list_of_files.txt (for /f "delims=" %%a in (''dir /B /O:N'') do echo %%a)
Nota: el archivo de salida no tendrá la marca de orden de bytes UTF-8.
Use cmd /U
Ver http://ss64.com/nt/cmd.html :
Los archivos de texto más comunes son ANSI, use estos conmutadores cuando necesite convertir el juego de caracteres. Estas opciones afectarán la canalización o la redirección a un archivo:
/A
Caracteres ANSI de salida/U
Salida caracteres UNICODE (UCS-2 Little Endian)
Aquí está mi intento (iniciarlo en cmd /A
, por supuesto):
@ECHO OFF >NUL
SETLOCAL EnableExtensions
:: create a UNICODE file with Byte Order Mark using `wmic`
chcp 852 >NUL
>list_of_files.txt wmic os get localdatetime
:: store a line with BOM to a variable
:: although FINDSTR does not support UTF-16 files
:: it will read first three bytes at least
for /F "delims=" %%G in (''
findstr "^" list_of_files.txt
'') do set "UTF8BOM=%%G"
:: write BOM only* to a file (* echo writes hexadecimal value FFFE0D0A)
:: the `<NUL set /p =text` trick does not work: chokes down leading `FF`
>list_of_files.txt echo(%UTF8BOM:~0,2%
chcp 65001 >NUL
:: add CRLF in Unicode (hexadecimal 0D000A00)
>>list_of_files.txt cmd /U /C echo(
:: add result of `dir /B /O:N` in Unicode
>>list_of_files.txt cmd /U /C dir /B /O:N
:: check the result: still invalid first line, see output
type list_of_files.txt
chcp 852 >NUL
Salida . Aún primera línea inválida (ese 0D0A
hexadecimal), lo siento; use otro método para obtener la marca de orden de bytes Utf-8 pura :
==>cmd /A /C D:/bat/SO/UTF8BOM32182619.bat
cpANSI_OoCcSsUu.txt
cpANSI_ÖöÇ窺Üü.txt
escrzyaie.txt
ěščřžýáíé.txt
list_of_files.txt
==>
En Windows 2003 funcionó esto:
chcp 65001 && cmd /C dir C:/WINDOWS/* && chcp 866
C:/windows/*
- única muestra
&& chcp 866
- página de códigos predeterminada y esto permite continuar el lote
"chcp 65001" no funciona antes de Windows 7. Hará que el lote finalice inmediatamente. No hay solución alternativa.
Lo he verificado probando directamente 2003, XP, Vista, 2008, 7, 8 y 10.
parece un problema que conocí recientemente
cd folder
dir /B /O:N > list_of_files.tmp
cmd /U /C type list_of_files.tmp>list_of_files.txt
del list_of_files.tmp