UTF8 支持 bat 文件中的 robocopy

UTF8 support for robocopy in bat file

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

我把下面的代码写得尽可能简洁。请检查为什么它不起作用? 注意:在 notepad++ 上,在编码菜单上,默认选择“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

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

@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 不同。它解释 \" 作为双引号的转义字符,尽管没有 file/folder 名称可以包含字符 "。因此,强烈建议避免在源路径和目标路径的末尾使用反斜杠。如果由于源路径或目标路径是驱动器的根目录而无法做到这一点,则该路径根本没有包含在 " 中,或者在第一个反斜杠转义的路径末尾使用两个反斜杠第二个反斜杠被解释为文字字符。所以工作也是:

%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,它们完全定义了该批处理文件所需的本地执行环境。有关这两个命令的更多详细信息,请参阅我在

上的回答

在命令CALL(参数0)和标签(参数1)之间也插入了一个space,以避免使用[=56访问两个文件系统=] 值 无效文件名 。由于缺少 space,call:F_SYNC 首先被解释为可执行文件或脚本的文件名。由于 无效文件名 错误 return,此字符串被 cmd.exe 第二次解释,然后拆分为两个参数 call :F_SYNC 现在检测到 callcmd.

的内部命令