如何在批处理文件中执行通配符字符串比较

MyD*_*ons 3 batch

我的批处理文件在屏幕上写了一个文件列表,其中包含 .cs 扩展名

for /F "usebackq delims=" %%A in (`cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do ( 
    if "%%~xA"==".cs"  echo %%A
)
Run Code Online (Sandbox Code Playgroud)

这工作正常。我想通过添加另一个条件来增强功能。如果某个词存在于短语中,我想删除它。这个词是obj

我的结果的例子是

myThing\obj\this.cs
obj\other\that\this.cs
debug\this\that.cs

我试过

for /F "usebackq delims=" %%A in (`cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do ( 
if "%%~xA"==".cs" if NOT "%%A"=="*obj*" echo %%A
)
Run Code Online (Sandbox Code Playgroud)

但这与第一个相比并没有改变结果。

我认为我的 if 语法是正确的,问题实际上出在 "%%A"=="*obj*"

Mic*_*icz 6

您的想法是正确的:*不支持通配符 ( )。

该问题的一个很好的解决方法是findstr,尽管您需要通过检索结果,%ERRORLEVEL%并且我认为您必须通过另一个变量缓存它(以便 nextif不会覆盖它的值):

echo %%A | findstr /C:"obj"
set obj_errorlevel=%errorlevel%

if "%%~xA"==".cs" if "%obj_errorlevel%"=="1" echo %%A
Run Code Online (Sandbox Code Playgroud)

……但那是一条艰难的路。

一种更简单的方法是if通过添加另一个管道阶段将条件添加到源命令(里面的那个)^| find /V "obj"

for /F "usebackq delims=" %%A in (`cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->" ^| find /V "obj"`)
Run Code Online (Sandbox Code Playgroud)