首页 > 解决方案 > 管理字符串中的重音字符

问题描述

我正在尝试制作一个简单的批处理脚本来比较两个文件并在发现差异时打开它们。所以我使用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 比较)。看到这个,我试图回显这两个变量。这就是我得到的:

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:我在带有 MINGW 的 windows10 64 位上使用 cmd 而不是 POWERSHELL。

标签: batch-filecharacter-encoding

解决方案


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

@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,您当前的想法仍然取决于语言/区域设置。


但是,在我看来,不需要 for或使用依赖于语言/区域设置的字符串跳过箍。您可以简单地使用返回的退出代码(ErrorLevel)

2无法打开至少一个文件。
1发现差异。
0没有遇到任何差异。
-1使用了无效的语法。

@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

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

@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

推荐阅读