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.
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
==>
"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.
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
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 .
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