Windows Cmd findstr - 数字正则表达式不起作用
Windows Cmd findstr - Regex with digits not working
我正在尝试验证传递给批处理文件的 IP 地址参数是否有效。
不幸的是,Windows findstr 不能可靠地工作,尽管输入的正则表达式是匹配的。
以下是所有结果的总结。
findstr 将 errorlevel 设置为 0(如果有匹配),如果没有匹配则为 1。
C:\iSTEP\VMTicketing\RealVNC>echo 192.10.10.10 | findstr /R "[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 192.101.101.101 | findstr /R "[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]"
192.101.101.101
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
0
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "[0-2][0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?"
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?"
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}*"
FINDSTR: No search strings
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
FINDSTR: No search strings
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}*"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\>"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
Commandoutput
使用 powershell 正则表达式执行匹配的简单方法:
@Echo off
Call :Regex "131.21.1.101" "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
Echo(%Errorlevel%
Call :Regex "1321.101" "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
Echo(%Errorlevel%
Goto :Eof
:Regex
powershell.exe -noprofile -c "'%~1' -match '%~2'" | findstr /l "True" > nul || Exit /b 1
Exit /b 0
有关 powershell 正则表达式语法的详细信息,请参阅 here
我刚刚尝试了以下方法:
echo 1.1.1.1 | findstr "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"
看起来它工作正常,但还有其他问题,比如像 isolationlayer_31bf3856ad364e35_10.0.14393.479_none_3b8c
这样的奇怪值也被显示。
我正在尝试验证传递给批处理文件的 IP 地址参数是否有效。 不幸的是,Windows findstr 不能可靠地工作,尽管输入的正则表达式是匹配的。
以下是所有结果的总结。
findstr 将 errorlevel 设置为 0(如果有匹配),如果没有匹配则为 1。
C:\iSTEP\VMTicketing\RealVNC>echo 192.10.10.10 | findstr /R "[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 192.101.101.101 | findstr /R "[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]"
192.101.101.101
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
0
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "[0-2][0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?"
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?"
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}*"
FINDSTR: No search strings
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
FINDSTR: No search strings
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}*"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\>"
C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1
Commandoutput
使用 powershell 正则表达式执行匹配的简单方法:
@Echo off
Call :Regex "131.21.1.101" "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
Echo(%Errorlevel%
Call :Regex "1321.101" "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
Echo(%Errorlevel%
Goto :Eof
:Regex
powershell.exe -noprofile -c "'%~1' -match '%~2'" | findstr /l "True" > nul || Exit /b 1
Exit /b 0
有关 powershell 正则表达式语法的详细信息,请参阅 here
我刚刚尝试了以下方法:
echo 1.1.1.1 | findstr "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"
看起来它工作正常,但还有其他问题,比如像 isolationlayer_31bf3856ad364e35_10.0.14393.479_none_3b8c
这样的奇怪值也被显示。