Ben*_*Ben 188 windows cmd substring batch-file
在批处理文件中,我有一个字符串abcdefg
.我想检查是否bcd
在字符串中.
不幸的是,似乎我找到的所有解决方案都搜索子文件的文件,而不是子字符串的字符串.
有一个简单的解决方案吗?
pax*_*blo 273
是的,您可以使用替换并检查原始字符串:
if not x%str1:bcd=%==x%str1% echo It contains bcd
Run Code Online (Sandbox Code Playgroud)
该%str1:bcd=%
位将用空字符串替换bcd
in str1
,使其与原始字符串不同.
如果原始文件中没有包含bcd
字符串,则修改后的版本将完全相同.
使用以下脚本进行测试将显示它的运行情况:
@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
Run Code Online (Sandbox Code Playgroud)
各种运行的结果:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Run Code Online (Sandbox Code Playgroud)
几个笔记:
if
声明是该解决方案的肉,其他的都是支持的东西.x
平等的双方之前是要确保字符串bcd
工作好.它还可以防止某些"不正当"的起始角色.gho*_*g74 102
您可以将源字符串传递给findstr
并检查其值,ERRORLEVEL
以查看是否找到了模式字符串.值为零表示成功并且找到了模式.这是一个例子:
::
: Y.CMD - Test if pattern in string
: P1 - the pattern
: P2 - the string to check
::
@echo off
echo.%2 | findstr /C:"%1" 1>nul
if errorlevel 1 (
echo. got one - pattern not found
) ELSE (
echo. got zero - found pattern
)
Run Code Online (Sandbox Code Playgroud)
当这在CMD.EXE中运行时,我们得到:
C:\DemoDev>y pqrs "abc def pqr 123"
got one - pattern not found
C:\DemoDev>y pqr "abc def pqr 123"
got zero - found pattern
Run Code Online (Sandbox Code Playgroud)
use*_*791 43
我通常做这样的事情:
Echo.%1 | findstr /C:"%2">nul && (
REM TRUE
) || (
REM FALSE
)
Run Code Online (Sandbox Code Playgroud)
例:
Echo.Hello world | findstr /C:"world">nul && (
Echo.TRUE
) || (
Echo.FALSE
)
Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)
Run Code Online (Sandbox Code Playgroud)
输出:
TRUE
FALSE
Run Code Online (Sandbox Code Playgroud)
我不知道这是不是最好的方法.
Ben*_*ick 19
为了兼容性和易用性,使用FIND执行此操作通常更好.
您还必须考虑是否要区分大小写或不区分大小写.
78分的方法(我相信我指的是paxdiablo的帖子)只会匹配Case Sensitively,所以你必须为你想要匹配的每个可能的迭代单独检查每个案例变体.
(多么痛苦!只有3个字母,这意味着9个不同的测试,以完成检查!)
此外,很多时候最好匹配命令输出,循环中的变量或批处理/ CMD中指针变量的值,这不是那么简单.
由于这些原因,这是一种更好的替代方法:
使用:查找[/ I] [/ V]"要匹配的字符"
[/ I](不区分大小写)[/ V](不得包含字符)
作为单行:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Run Code Online (Sandbox Code Playgroud)
多行:
ECHO.%Variable%| FIND /I "ABC">Nul && (
Echo.Found "ABC"
) || (
Echo.Did not find "ABC"
)
Run Code Online (Sandbox Code Playgroud)
如上所述,这对于那些不允许字符串替换的变量的内容非常有用:
FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) )
Run Code Online (Sandbox Code Playgroud)
从命令输出:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这是处理检查的最佳方式,原因有多种.
小智 9
如果您正在检测是否存在,这是最简单的解决方案:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Run Code Online (Sandbox Code Playgroud)
这非常适合将windows命令的输出删除到布尔变量中.只需将echo替换为您要运行的命令即可.您还可以将Findstr串在一起,以使用管道进一步限定语句.用于服务控制的EG(SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Run Code Online (Sandbox Code Playgroud)
那个评估SC查询的Windows更新服务的输出,它作为多行文本出现,找到包含"state"的行,然后查找该行上是否出现"running",并相应地设置errorlevel.
小智 8
要在 Var 中查找文本,示例:
var_text="demo string test"
Echo.%var_text% | findstr /C:"test">nul && (
echo "found test"
) || Echo.%var_text% | findstr /C:"String">nul && (
echo "found String with S uppercase letter"
) || (
echo "Not Found "
)
Run Code Online (Sandbox Code Playgroud)
传奇:
&
执行那个和执行这个||
例如: Execute_that IF_FAIL 执行此操作&&
例如: Execute_that IF_SUCCESSFUL 执行此操作>nul
命令没有回显结果/C:
使用字符串作为文字搜索字符串对我来说最好的方法是:
call :findInString "HelloWorld" "World"
:findInString
ECHO.%1 | FIND /I %2>Nul && (
Echo.Found
) || (
Echo.Not found
)
Run Code Online (Sandbox Code Playgroud)
小智 5
我可能对这个答案来得太晚了,但接受的答案仅适用于检查“硬编码字符串”是否是搜索字符串的一部分。
对于动态搜索,您必须这样做:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Run Code Online (Sandbox Code Playgroud)
注意:您可以将这两个变量作为参数。
归档时间: |
|
查看次数: |
347381 次 |
最近记录: |