使用 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
也许这个问题可以被认为是这些问题的重复:
- Question 1
- Question 2
但是我没有找到解决问题的方法。
有什么想法吗?
编辑 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
我正在尝试使用 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
也许这个问题可以被认为是这些问题的重复:
- Question 1
- Question 2
但是我没有找到解决问题的方法。
有什么想法吗?
编辑 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