将`dir`输出重定向到文件后编码不正确

use*_*649 7 encoding cmd batch-file

我在欧洲的Windows cmd.exe上运行此代码,我在这里使用本地设置,用于我的语言.所以我在目录的名称中使用变音符号.

我尝试列出目录的名称,并正确显示.然后我将它们保存到文件中,但是当我在记事本中打开它时,变音符号是不可读的:例如,而不是St?ední ?echy我有Stýedn? ¬echy.

我做错了什么,如何纠正?

@echo off
del directories.conf
FOR /F "delims=!" %%R IN ('dir * /b /a:d /o:n') DO (

 IF EXIST "%%R\scenery" ( 
  echo %%R
  echo %%R >> directories.conf
 ) ELSE (ECHO NOT INCLUDED %%R)

)
Echo Directory list created...
pause
Run Code Online (Sandbox Code Playgroud)

Alo*_*dal 12

尝试使用/ u开关启动cmd.exe.这将导致cmd以UTF-16写入.

您还需要使用切换到代码页1250(ANSI for Central Europe)chcp 1250.

您可以在批处理脚本中执行此操作.我为你做了一个.结构是:

.\Jižní Morava
.\Jižní Morava\scenery
.\Pelh?imov
.\Pelh?imov\scenery
.\Nic moc výlet
.\St?ední ?echy
.\St?ední ?echy\scenery
Run Code Online (Sandbox Code Playgroud)

和剧本:

@echo off

if _%1_==_main_ (
    call :main
) else (
    cmd /u /c "%0 main"
)
goto :eof

:main
    chcp 1250
    del directories.conf
    for /F "delims=!" %%R in ('dir * /b /a:d /o:n') do (
        if exist %%R\scenery (
            echo %%R
            echo %%R >> directories.conf
        ) else (
            echo not included: %%R
        )
    )
    echo Directory list created...
    pause
goto :eof
Run Code Online (Sandbox Code Playgroud)

另外,我建议你阅读andrewdotn对相关问题的出色答案.