管理字符串中的重音字符

Manage accented characters in string

我正在尝试制作一个简单的批处理脚本来比较两个文件并在发现差异时打开它们。 所以我用FC来比较文件;如果没有发现差异,它将向我发送此文本:

Comparaison des fichiers FILE1 et FILE2
FC : aucune différence trouvée

如您所见,它是法语的,并且包含重音字符。那是我的问题。 到目前为止,这是我的代码:

@echo off
set "FILE1=file1path"
set "FILE2=file2path"
set "edit=editorpath"
for /F "tokens=*" %%F in ('fc /A /C /N "%FILE1%" "%FILE2%"') do (
    set "DIFF=%%F"
)

set "NODIFF=FC : aucune différence trouvée"
if /I "%DIFF%"=="%NODIFF%" (
    echo "no difference found"
) else (
    start "" %edit% %FILE1%
    start "" %edit% %FILE2% 
)

问题出在“%DIFF%==%NODIFF%:这两个变量总是不同的,即使它们应该相同(我已经尝试过使用或不使用“”来进行集合和 If 比较)。为了看到这一点,我尝试回显两个 var。这是我得到的:

echo %DIFF%
FC : aucune différence trouvée
echo %NODIFF% 
FC : aucune diff├®rence trouv├®e

好像编码不一样。我找到的大多数答案是使用一些 chcp (具有不同的值)。如果我理解得很好,它应该更改编码以使重音字符“起作用”。所以我尝试添加

chcp 65001>nul

我的代码,但后来我得到了这个结果:

echo %DIFF%
FC[?]: aucune diff[?]rence trouv[?]e
echo %NODIFF%
FC : aucune différence trouvée

所以现在第二个字符串可以了,但是第一个就不行了。我试过其他数字而不是 65001,但它们只会让两个字符串都出错(而且方式不同)。

ofc 我也可以这样做:

chcp 850
echo %DIFF%
FC : aucune différence trouvée
chcp 65001
echo %NODIFF%
FC : aucune différence trouvée

但是在 IF 语句中,我无法在进行比较时更改 chcp。

有人知道如何让它发挥作用吗?

PS:我在 windows10 64 位 MINGW 上使用 cmd 而不是 POWERSHELL。

如果你真的想做你想做的,那么只需将你的结果缩小到只验证已知的标准字符:

@Echo Off
Set "FILE1=file1path"
Set "FILE2=file2path"
Set "edit=editorpath"
For /F Delims^=^ EOL^= %%G In (
    '""%__APPDIR__%fc.exe" /A /C /N "%FILE1%" "%FILE2%""') Do Set "DIFF=%%G"
If /I Not "%DIFF%"=="%DIFF: aucune diff=%" (Echo no difference found) Else (
    Start "" "%edit%" "%FILE1%"
    Start "" "%edit%" "%FILE2%")
Exit /B

本质上,您在比较两个字符串时不区分大小写,第二个字符串删除了子字符串 aucune diff。如果它们不相同,则子字符串是字符串的一部分。 请注意,由于英文版本会使用 FC: no differences encountered,您目前的想法仍然 language/locale 依赖。


但是,在我看来,没有必要使用 或使用 language/locale 依赖字符串来跳过箍。您可以简单地使用返回的退出代码,(ErrorLevel):

2 Could not open at least one of the files.
1 Differences found.
0 No differences encountered.
-1 Invalid syntax used.

@Echo Off
Set "FILE1=fileone.cmd"
Set "FILE2=filetwo.cmd"
Set "FILE3=filethree.cmd"
"%__AppDir__%fc.exe" /A /C /N "%FILE1%" "%FILE2%" >NUL 2>&1
If %ERRORLEVEL% Equ 2 (Echo Could not open at least one of the files.
) Else If %ERRORLEVEL% Equ 1 (Start "" "%edit%" "%FILE1%"
    Start "" "%edit%" "%FILE2%") Else If %ERRORLEVEL% Equ 0 (
    Echo No differences encountered.) Else Echo Invalid syntax used.
Pause
GoTo :EOF

尽管出于您的目的,您可以简单地使用 &&|| 来有条件地确定上一个命令是否成功:

@Echo Off
Set "FILE1=file1path"
Set "FILE2=file2path"
Set "edit=editorpath"
%__APPDIR__%fc.exe /A /C /N "%FILE1%" "%FILE2%" >NUL 2>&1 && (
    Echo no difference found) || (Start "" "%edit%" "%FILE1%"
    Start "" "%edit%" "%FILE2%")
Exit /B