【问题标题】:UTF8 support for robocopy in bat filebat 文件中对 robocopy 的 UTF8 支持
【发布时间】:2022-06-23 18:13:23
【问题描述】:

我正在尝试制作一个 bat 文件来同步文件夹。 我还不能安装 WASL,所以现在,rsync 不是一个选项。

我尽可能简洁地编写了下面的代码。请检查为什么它不起作用? 注意:在记事本++ 上,在编码菜单上,默认选择“UTF8”。我试图点击“转换为 UTF8”;什么也没发生。

请帮忙!

CHCP 65001
REM @ECHO OFF

REM GLOBALS
SET V_PF=\\10.0.0.222\kalite_dokumanlar\
SET V_PT=C:\me\desk\KALİTE\

REM INIT
GOTO:F_MAIN

REM FUNCTIONS
:F_SYNC
    SETLOCAL ENABLEDELAYEDEXPANSION
        SET V_IN=%~1
        robocopy "%V_PF%%V_IN%\" "%V_PT%%V_IN%\" /MIR
    ENDLOCAL
EXIT /B 0

REM MAIN
:F_MAIN
call:F_SYNC "DESTEK"
call:F_SYNC "MÜŞTERİ ve TEDARİK"
call:F_SYNC "SİSTEM"
call:F_SYNC "ÜRETİM"

REM SAVE WITH NOTEPAD++ ENCODED UTF8 WITHOUT BOM

查看代码github

【问题讨论】:

  • ENABLEDELAYEDEXPANSION 但从不使用它?
  • 只是为了扩展,您没有使用 Unicode UTF-8 字符,这些只是 OEM 代码页 857 下可用的土耳其语字符。所以您应该使用该代码页编写批处理文件,如果需要,请确保批处理文件标识当前代码页,如果不是 857,则将其更改为那个。

标签: windows batch-file utf-8 robocopy


【解决方案1】:

目录同步任务可以通过以下批处理文件完成:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
@REM Get the current code page and remember it with the environment variable InitialCodePage.
FOR /F "tokens=*" %%I IN ('%SystemRoot%\System32\chcp.com') DO FOR %%J IN (%%I) DO SET /A "InitialCodePage=%%J" 2>NUL
@REM Change the code page to UTF-8.
%SystemRoot%\System32\chcp.com 65001 >NUL

@REM GLOBALS
SET "V_PF=\\10.0.0.222\kalite_dokumanlar\"
SET "V_PT=C:\me\desk\KALİTE\"

@REM INIT
GOTO:F_MAIN

@REM FUNCTIONS
:F_SYNC
    SET "V_IN=%~1"
    @REM /NDL /NFL: NO LOGS = NO GARBAGE CHARS CON:
    @REM /NJH /NJS: NO VERBOSE START-END 
    @REM /R:3: LIMIT RETRY 
    @REM /W:10: WAIT ON ERROR 
    %SystemRoot%\System32\robocopy.exe "%V_PF%%V_IN%" "%V_PT%%V_IN%" /MIR /R:3 /W:10
EXIT /B 0

@REM MAIN
:F_MAIN
CALL :F_SYNC "DESTEK"
CALL :F_SYNC "MÜŞTERİ ve TEDARİK"
CALL :F_SYNC "SİSTEM"
CALL :F_SYNC "ÜRETİM"

@REM Restore the initial code page.
%SystemRoot%\System32\chcp.com %InitialCodePage% >NUL
ENDLOCAL

@REM SAVE THAT CODE ENCODED UTF-8 WITHOUT BOM

主要更正是在 ROBOCOPY 命令行中删除源路径和目标路径末尾的反斜杠。 %SystemRoot%\System32\robocopy.exe 与大多数其他 Windows commands 不同。它将\ 左至" 解释为双引号的转义字符,尽管没有文件/文件夹名称可以包含字符"。出于这个原因,强烈建议避免在源路径和目标路径的末尾使用反斜杠。如果由于源路径或目标路径是驱动器的根目录而无法做到这一点,则该路径根本没有包含在 " 中,或者在第一个反斜杠转义第二个反斜杠的路径末尾使用两个反斜杠反斜杠被解释为文字字符。所以工作也是:

%SystemRoot%\System32\robocopy.exe "%V_PF%%V_IN%\\" "%V_PT%%V_IN%\\" /MIR /R:3 /W:10

对可执行文件使用完全限定的文件名可以减少文件系统访问次数,因为 Windows 命令处理器 cmd.exe 在这种情况下不需要搜索可执行文件。批处理文件变得独立于环境变量PATHPATHEXT 使用完全限定的文件名。

子例程F_SYNC 内的命令SETLOCAL ENABLEDELAYEDEXPANSIONENDLOCAL 没有用,因此从代码中删除。相反,在顶部插入了一个 SETLOCAL,在底部插入了一个 ENDLOCAL,它们完全定义了该批处理文件所需的本地执行环境。有关这两个命令的更多详细信息,请参阅我在
How to pass environment variables as parameters by reference to another batch file?

上的回答

在命令CALL(参数0)和标签(参数1)之间还插入了一个空格,以避免两个文件系统访问返回值无效的文件名 .由于缺少空格,call:F_SYNC 首先被解释为可执行文件或脚本的文件名。这个字符串被 cmd.exe 第二次解释,只是因为 invalid file name 错误返回,然后分成两个参数 call:F_SYNC 现在检测到 callcmd 的内部命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多