使用 Findstr 批量查找非 ASCII 字符的字符串

Using Findstr to find some string with non-ASCII character by batch

我正在尝试使用 Testing_Results1 中的 findstr 来查找字符串 Conexão falhou.。但是不工作,因为 ã。 我试图将 Conexão 替换为 ConexÆo 但没有成功。还尝试通过这种方式跳过 ã 但也不起作用。

:Testing_Results1
    findstr /I /C:"Conexão falhou." WinSCP.log >nul && (
              echo Sem conexÆo com a internet.
              echo Verifique o problema e tente novamente.
              pause
              goto End
    ) || (
              goto Testing_Results2        
    )

    :Testing_Results2

    findstr /I /C:"Conexão perdida" WinSCP.log >nul && (
              echo ConexÆo com o servidor perdida. Tente novamente.
              pause
              goto end
    ) || (
              goto Success
    )

    :Success
    echo Arquivo(s) Exportado(s) com sucesso.
    echo/ &echo/ &echo/
    pause
    goto End


    :Error
    echo Erro desconhecido ocorrido.
    pause
    goto End

    :End
    del /f /s /q %temp%\ftpsend.dat >nul 2>nul
    del /f /s /q WinSCP.log >nul 2>nul
    exit

也许这个问题可以被认为是这些问题的重复:

但是我没有找到解决问题的方法。

有什么想法吗?


编辑 1:

关注我的一段WinSCP.log

. 2019-05-24 14:36:21.725 --------------------------------------------------------------------------
. 2019-05-24 14:36:21.725 Session name: xxxx@ftp.xxxx.com.br (Ad-Hoc site)
. 2019-05-24 14:36:21.725 Host name: ftp.xxxx.com.br (Port: 21)
. 2019-05-24 14:36:21.725 User name: xxxxx(Password: Yes, Key file: No, Passphrase: No)
. 2019-05-24 14:36:21.725 Transfer Protocol: FTP
. 2019-05-24 14:36:21.725 Ping type: Dummy, Ping interval: 30 sec; Timeout: 15 sec
. 2019-05-24 14:36:21.725 Disable Nagle: No
. 2019-05-24 14:36:21.725 Proxy: None
. 2019-05-24 14:36:21.725 Send buffer: 262144
. 2019-05-24 14:36:21.725 UTF: Auto
. 2019-05-24 14:36:21.725 FTPS: None [Client certificate: No]
. 2019-05-24 14:36:21.725 FTP: Passive: Yes [Force IP: Auto]; MLSD: Auto [List all: Auto]; HOST: Auto
. 2019-05-24 14:36:21.725 Local directory: default, Remote directory: home, Update: Yes, Cache: Yes
. 2019-05-24 14:36:21.725 Cache directory changes: Yes, Permanent: Yes
. 2019-05-24 14:36:21.725 Recycle bin: Delete to: No, Overwritten to: No, Bin path: 
. 2019-05-24 14:36:21.725 Timezone offset: 0h 0m
. 2019-05-24 14:36:21.725 --------------------------------------------------------------------------
. 2019-05-24 14:36:21.725 Conectando a ftp.xxxxx.com.br...
. 2019-05-24 14:36:21.725 Conexão falhou.

编辑 2:

使用此代码关注我 cmd 的图像:

@echo on
findstr /I /C:"Conexão falhou" WinSCP.log 
echo %errorlevel%
pause

您看到的确切行为在一定程度上取决于您的文本文件使用的代码页。假设您的文件使用代码页 1252 - 拉丁语(西欧),则 ã 为 0xE3(十进制 227)。

FINDSTR 失败的原因在 命令行参数的字符限制 - 扩展 ASCII 转换 部分下的 What are the undocumented features and limitations of the Windows FINDSTR command? 中进行了解释。它解释了 FINDSTR 如何将许多 non-ASCII 命令行字符转换(破坏)为 ASCII 值。

如果您阅读参考部分,您会看到字符 227 被转换为 112,对应于字母 p。所以你的 FINDSTR 命令正在寻找错误的字符串。

使用 FINDSTR 搜索字符串的唯一方法是将搜索字符串放在文本文件中并使用 /g:file 选项。使用 /G 选项时,FINDSTR 不会损坏字符。

如果 "search.txt" 的内容是单行 Conexão falhou,则以下命令将匹配正确的行:

findstr /I /L /G:search.txt WinSCP.log

也就是说,字符串的显示方式可能不正确,具体取决于您的活动代码页。我的机器默认为代码页 437,因此 ã 在我的机器上显示为 π。无论哪种方式,字符代码都是 0xE3。如果将 FINDSTR 的结果通过管道传输到文件,您应该会看到正确的结果。

如果您真的想将搜索字符串放在命令行中,那么您可以通过添加 /R 选项显式指定正则表达式搜索,即使您使用 /C。然后,您可以使用 . 匹配违规位置的任何字符。

findstr /I /R /C:"Conex.o falhou" WinSCP.log

另一种选择是改用 FIND 命令:

find /I "Conexão falhou" <"WinSCP.log"

尽管在我的机器上我需要以下内容,因为活动代码页 437

find /I "Conexπo falhou" <"WinSCP.log