web-dev-qa-db-fra.com

chcp 65001 et un fichier .bat

J'ai un problème avec la commande chcp 65001 dans Windows Shell.

J'ai besoin de générer une liste de fichiers dans un dossier. J'ai donc lancé cmd.exe, tapé

cd folder
dir /B /O:N > list_of_files.txt

Cela a fonctionné, mais j’ai eu un problème avec les caractères spéciaux non ASCII qui figurent dans certains noms de fichiers. J'ai donc ajouté chcp 65001

Tout a fonctionné, mais lorsque je mets ces commandes dans un fichier .bat, le script ne fonctionne pas.

Alors

cd folder
chcp 65001
dir /B /O:N > list_of_files.txt

ne génère pas la liste.

et

cd folder
chcp 65001 && dir /B /O:N > list_of_files.txt

aussi bien que

cd folder
chcp 65001 > nul && dir /B /O:N > list_of_files.txt

génère la liste, mais avec l'encodage par défaut: /.

Tout fonctionne dans cmd.exe, mais pas dans les fichiers .bat.

J'ai lu le sujet: stackoverflow.com/questions/2182568/batch-script-is-not-executed-if-chcp-was-called , mais cela n'a pas aidé.

EDIT: J'ai partiellement résolu mon problème en remplaçant chcp 65001 par chcp 1250 car tous les caractères étaient dans cet encodage. Mais en réalité, cela ne répond pas à la question.

7
maro

Utilisez cmd /U. Voir http://ss64.com/nt/cmd.html :

Les fichiers texte les plus courants sont ANSI, utilisez ces commutateurs lorsque vous devez Convertir le jeu de caractères. Ces options affecteront piping ou Redirigeant vers un fichier:

  • /A Caractères ANSI en sortie
  • /U Caractères UNICODE en sortie (UCS-2 Little Endian)

Voici ma tentative (lancez-la sous cmd /A, bien sûr):

@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

Sortie . Première ligne toujours invalide (cet hexadécimal 0D0A), désolé; utilisez une autre méthode pour obtenir pure Utf-8 byte order mark:

==>cmd /A /C D:\bat\SO\UTF8BOM32182619.bat
਍
cpANSI_OoCcSsUu.txt
cpANSI_ÖöÇ窺Üü.txt
escrzyaie.txt
ěščřžýáíé.txt
list_of_files.txt

==>
4
JosefZ

"chcp 65001" ne fonctionnait pas avant Windows 7. Le lot se terminerait immédiatement. Il n'y a pas de solution de rechange.

J'ai vérifié cela en testant directement 2003, XP, Vista, 2008, 7, 8 et 10.

2
Gammadyne

cela ressemble à un problème J'ai récemment rencontré

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
0
Paul

Testé sous Windows 7 uniquement, risque de ne pas fonctionner sous Windows Vista.

Apparemment, chcp n'affecte pas directement dir.

Analysez le résultat de dir et imprimez-le avec echo:

chcp 65001
>list_of_files.txt (for /f "delims=" %%a in ('dir /B /O:N') do echo %%a)

Remarque: le fichier de sortie n'aura pas UTF-8 Byte Order Mark .

0
wOxxOm

Sous Windows 2003, cela fonctionnait:

chcp 65001 && cmd /C dir C:\WINDOWS\* && chcp 866

C:\windows\* - échantillon uniquement

&& chcp 866 - page de code par défaut permettant de continuer le traitement par lots

0
SolarWind