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

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

我的批处理文件在屏幕上写入包含 .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
)

这很好。我想通过添加另一个条件来增强功能。我想删除短语中存在的某个单词。该单词是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
)

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

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

答案1

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

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

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

if "%%~xA"==".cs" if "%obj_errorlevel%"=="1" echo %%A

...但这是一个困难的方法。

更简单的方法是通过添加另一个管道阶段将条件添加到源命令(里面的命令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"`)

答案2

我认为您的编辑是正确的,因为您不能在 If 字符串比较中使用通配符。它实际上是在查找*obj*,包括星号。

也许使用查找字符串而是.cs通过管道传输所有匹配项。如果找到,则返回错误级别 0,如果未找到,则返回 1。

代码示例:

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 | findstr /C:"obj" 1>nul & if errorlevel 1 echo %%A
)

答案3

星号不被解释为通配符,因此条件计算结果为 false。您可以使用第二个 if 语句来确定变量是否包含文本“obj”。如果找到匹配项,则findstr命令设置为零,否则设置为零。%errorlevel%

使用此值的一个方便方法是通过条件命令分隔符&&和。仅当前一个命令返回非零错误级别时,才会执行||附加的命令,例如:||

(echo %%A | findstr /R .*obj.*)>NUL || 
  if "%%~xA"==".cs" echo %%A

在此场景中,添加>NUL非常重要。如果不抑制输出,第一行和第二行都可以打印变量%%A。为了避免混淆,您需要让不同的情况产生不同的结果。

当然,如果您已经在使用findstr,则可以完全删除 if 语句及其主体。无论哪种方式,可读性都不是很好;以下代码是作为替代方案提供的。

(echo %%A|findstr /R /V ".*obj.*")|findstr /R /C:"\.cs $"

答案4

一个可能适合你想要的解决方案。这使用了SET字符串替换,如罗布·范德沃德的网站。

@echo off
set _myvar=this\has\obj\in the string
echo Original: %_myvar%
::replace the string obj in _myvar
set _myvar=%_myvar:obj=%
::replace any double back-slashes in _myvar
set _myvar=%_myvar:\\=\%
echo Withou obj: %_myvar%

_myvar最初包含字符串“obj”。第一次我们使用 SET 的字符串替换删除该字符串。第二次,我们删除由于“obj”的位置而可能遗留的任何双斜杠。冒号后面是要在变量中查找的字符串。要替换的字符串位于替换结束之前的等号后面。

希望有帮助!

相关内容