我的批处理文件在屏幕上写入包含 .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”的位置而可能遗留的任何双斜杠。冒号后面是要在变量中查找的字符串。要替换的字符串位于替换结束之前的等号后面。
希望有帮助!