【问题标题】:Manage accented characters in string管理字符串中的重音字符
【发布时间】:2020-10-21 17:23:17
【问题描述】:

我正在尝试制作一个简单的批处理脚本来比较两个文件并在发现差异时打开它们。 所以我使用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:我在带有 MINGW 的 windows10 64 位上使用 cmd 而不是 POWERSHELL。

【问题讨论】:

  • 似乎 file1 和 file2 有不同的编码。所以文件永远不会相同。
  • 不,FC 回馈“未发现差异”,因此文件是相同的。问题是我存储在%DIFF% 中的FC 返回(即“aucune différence trouvée”)与我设置的变量%NODIFF% 的编码不同。并认为%DIFF%%NODIFF% 这两个变量永远不会相同。

标签: batch-file character-encoding


【解决方案1】:

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

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


但是,在我看来,没有必要使用 或跳过与语言/区域设置相关的字符串。您可以简单地使用返回的退出代码,(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

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

@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

【讨论】:

  • 非常感谢!起初我只是想将 FC 的结果作为二进制文件,但我不知道有 ErrorLevel !我肯定会用它:) 第一个还是很有趣的,我完全忘记了我们可以这样比较-_-
猜你喜欢
  • 2018-07-09
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
相关资源
最近更新 更多