batch-file - 管理字符串中的重音字符
问题描述
我正在尝试制作一个简单的批处理脚本来比较两个文件并在发现差异时打开它们。所以我使用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。
解决方案
如果您真的想做您想做的事,那么只需将结果缩小到仅验证已知的标准字符:
@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
推荐阅读
- arduino - ATMega328P ADCSRA 寄存器问题
- angular - Angular 12 延迟加载语法 - 什么是正确的?
- python - 使用下划线作为与python中的关键字名称相同的变量
- java - 如何显示底部对话框
- formsflow.ai - 使用工作流“电子邮件通知”创建的表单
- java - 带有传统 Java 的 keycloak:一个简单的 api 示例?
- arrays - Ruby 中的数组解构
- python - 气流任务状态失败,“重试”参数> 0
- javascript - 我创建了随机密码生成器。它接受数字并打印该长度的随机密码。它在控制台上打印密码但被刷新
- c# - 事件侦听器不适用于 firebase 查询