【问题标题】:How do I create files/folders with diacritics using a bat script如何使用 bat 脚本创建带有变音符号的文件/文件夹
【发布时间】:2015-07-30 07:52:00
【问题描述】:

我有一个 bat 文件,它读取文件中的行,然后根据给定的参数尝试创建文件或文件夹。

问题是当它以 ăațîș 的形式获取字符时,它不起作用。

这是我的代码:

IF "%1"=="" GOTO Final
IF "%1"=="file" GOTO File
IF "%1"=="folder" GOTO Folder

:File
    for /f %%i in (files.txt) do echo. > %%i.rtf
GOTO Final

:Folder
    for /f "tokens=*" %%a in (folders.txt) do (
    mkdir "%%a"
    )
GOTO Final

:Final

到目前为止我使用此链接所做的尝试:Manage paths with accented characters

  1. bat 脚本是 ANSI
  2. CHCP 1250 > NUL

我该如何解决这个问题?

【问题讨论】:

标签: batch-file encoding diacritics


【解决方案1】:

CHCP XXX 放入批处理中,其中 XXX 是与您的文本文件(files.txt 和folders.txt)的编码相匹配的代码页。请注意,您可以使用CHCP 65001,它等效于 UTF-8,应该可以毫无问题地处理大多数变音符号。

【讨论】:

    【解决方案2】:

    避免在文件和文件夹名称中使用重音字符。否则,mojibake 在 Windows 命令行中得到保证。

    md files   2>NUL
    pushd files
    md unASCII 2>NUL
    chcp 852 >nul
    echo ěščřžýáíé-852>diacritic--852.txt
    chcp 1250 >nul
    echo ěščřžýáíé1250>diacritic-1250.txt
    
    chcp 1250 >nul
    findstr /R "^" "diacritic-*.txt"
    for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
    for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%gANSI.txt"
    chcp 852 >nul
    findstr /R "^" "diacritic-*.txt"
    for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
    for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%g-OEM.txt"
    popd
    

    请注意,上面的CLI 命令列表不是.bat 代码sn-p。但是,在命令行窗口中复制和粘贴它会给出大致的下一个 输出,显示当文件创建并且使用必须响起时代码页实际在彼此。否则,一个结晶的 mojibake 可见,参见例如findstr /R "^" "diacritic-*.txt":

    ==>md files   2>NUL
    ==>pushd files
    ==>md unASCII 2>NUL
    
    ==>chcp 852 >nul
    ==>echo ěščřžýáíé-852>diacritic--852.txt
    
    ==>chcp 1250 >nul
    ==>echo ěščřžýáíé1250>diacritic-1250.txt
    
    ==>
    ==>chcp 1250 >nul
    
    ==>findstr /R "^" "diacritic-*.txt"
    diacritic--852.txt:Řçźý§ě ˇ‚-852
    diacritic-1250.txt:ěščřžýáíé1250
    
    ==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
    diacritic--852.txt:Řçźý§ě ˇ‚-852
    diacritic-1250.txt:ěščřžýáíé1250
    
    ==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%gANSI.txt"
    
    ==>chcp 852 >nul
    
    ==>findstr /R "^" "diacritic-*.txt"
    diacritic--852.txt:ěščřžýáíé-852
    diacritic-1250.txt:ýÜŔ°×řßÝÚ1250
    
    ==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
    diacritic--852.txt:ěščřžýáíé-852
    diacritic-1250.txt:ýÜŔ°×řßÝÚ1250
    
    ==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%g-OEM.txt"
    
    ==>popd
    

    我们已将ěščřžýáíé 字符串(后跟 CHCP 编号)写入下一个文件:

    • files\diacritic--852.txt 文件中的 ěščřžýáíé-852 字符串,以及
    • files\diacritic-1250.txt 文件中的ěščřžýáíé1250 字符串。

    然后,我们使用这些字符串创建 <String><Chcp><CPID>.txt 名称模式的文件,其中

    • <String> = ěščřžýáíédiacritic-<Chcp>.txt 文件中读取的带有变音符号的字符串;
    • <Chcp> = -8521250diacritic-<Chcp>.txt 文件所在的代码页;
    • <CPID> = -OEMANSI:编写此文件的代码页名称的文本缩写(分别为8521250)。

    让我们尝试使用最后四个文件:Copy&Paste 再次在命令行窗口中code sn-p

    chcp 437 >nul
    dir /B /S "files\unASCII\*.txt"
    for %G in (files\unASCII\ěščřžýáíé*.txt) do @echo %G
    findstr /S /R "^" "files\unASCII\ěščřžýáíé*.txt"
    
    chcp 1250 >nul
    for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
    chcp 852 >nul
    for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
    

    输出:我们可以一次又一次地看到 mojibake

    ==>chcp 437 >nul
    
    ==>dir /B /S "files\unASCII\*.txt"
    d:\bat\files\unASCII\ýÜŔ°×řßÝÚ1250-OEM.txt
    d:\bat\files\unASCII\ěščřžýáíé-852-OEM.txt
    d:\bat\files\unASCII\ěščřžýáíé1250ANSI.txt
    d:\bat\files\unASCII\Řçźý§ě ˇ‚-852ANSI.txt
    
    ==>for %G in (files\unASCII\ěščřžýáíé*.txt) do @echo %G
    files\unASCII\ěščřžýáíé-852-OEM.txt
    files\unASCII\ěščřžýáíé1250ANSI.txt
    
    ==>findstr /S /R "^" "files\unASCII\ěščřžýáíé*.txt"
    
    ==>
    ==>chcp 1250 >nul
    
    ==>for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
    
    ==>type "files\unASCII\ěščřžýáíé-852-OEM.txt"
    diacritic--852:Řçźý§ě ˇ‚-852
    
    ==>type "files\unASCII\ěščřžýáíé1250ANSI.txt"
    diacritic-1250:ěščřžýáíé1250
    
    ==>chcp 852 >nul
    
    ==>for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
    
    ==>type "files\unASCII\ěščřžýáíé-852-OEM.txt"
    diacritic--852:ěščřžýáíé-852
    
    ==>type "files\unASCII\ěščřžýáíé1250ANSI.txt"
    diacritic-1250:ýÜŔ°×řßÝÚ1250
    

    OOPS,为什么findstr 没有输出?让我们使用

    chcp 1250 >nul
    findstr /S /R "^" "files\unASCII\*.txt"
    chcp 852 >nul
    findstr /S /R "^" "files\unASCII\*.txt"
    

    输出显示findstr 不仅在文件contents中而且在文件names中导致mojibake > 还有:

    ==>chcp 1250 >nul
    
    ==>findstr /S /R "^" "files\unASCII\*.txt"
    FINDSTR: Cannot open files\unASCII\ŤsR›zr ˇ‚1250-OEM.txt
    FINDSTR: Cannot open files\unASCII\escrzŤ˙­'-852-OEM.txt
    FINDSTR: Cannot open files\unASCII\escrzŤ˙­'1250ANSI.txt
    FINDSTR: Cannot open files\unASCII\RÎzŤäe?'-852ANSI.txt
    
    ==>chcp 852 >nul
    
    ==>findstr /S /R "^" "files\unASCII\*.txt"
    FINDSTR: Cannot open files\unASCII\ŹsRŤzráíé1250-OEM.txt
    FINDSTR: Cannot open files\unASCII\escrzŹ ş'-852-OEM.txt
    FINDSTR: Cannot open files\unASCII\escrzŹ ş'1250ANSI.txt
    FINDSTR: Cannot open files\unASCII\R╬zŹńeś?'-852ANSI.txt
    

    仅供参考:CHCP 65001 (UTF-8) 也无济于事...根据MSDN: Naming Files, Paths, and Namespaces,Windows NTFS 对象名称似乎是UTF-16 编码的:

    在较新的文件系统上,例如 NTFSexFATUDFSFAT32, Windows 以 Unicode 的形式将长文件名存储在磁盘上...文件 系统将路径和文件名视为 WCHARs 的不透明序列。

    此外:

    shell 和文件系统有不同的要求。 这是 可以使用 shell 用户的 Windows API 创建路径 接口无法正确解释

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2012-12-25
      • 1970-01-01
      • 2011-06-02
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多