我写这样的脚本:
@ECHO OFF
setlocal EnableDelayedExpansion
set "remove=ABC"
echo. %remove%
Set FILENAME="456_789_ABC00011092_789_EFGHIK_56893.mpg"
for %%a in (%FILENAME:_=" "%) do (
set TEN=%%a
echo. %AB%
set "remove_1=ABC"
echo. %remove_1%
Set _TEN=!TEN:%remove%=!
echo. %_TEN%
Set i=0
IF !_TEN! NEQ !TEN! (
set /A i+=1
set "String[!i!]=%%~a"
)
)
pause
exit
为什么echo. %AB%
echo. %remove_1%
结果为
我将%
替换为!
。它工作正常,但命令Set _TEN=!TEN:!remove_1!=!
未运行
修改 - (来自当前发布的其他问题作为答案)
当我像这样使用FindStr命令时:
for %%a in (%FILENAME:_=" "%) do (
echo %%a | findstr /I /R /C:"ABC" >nul
ECHO %errorlevel%
if "%errorlevel%" equ "0" (
set /A i+=1
set "String[!i!]=%%~a"
)
)
为什么errorlevel
总是= 0
答案 0 :(得分:0)
%AB%
尚未在您发布的脚本中定义,因为它没有值echo
,因为 {{1},您只会得到一个空行在.
之后。由于echo
是在循环(代码块)中设置的,因此您应该使用延迟扩展语法remove_1
。对于Echo !remove_1!
来说,它是相同的,即echo. %_TEN%
,并且如果先前已定义Echo !_TEN!
,则为Echo !AB!
。为了获得Set
_TEN
变量所需的双倍扩展,您可以使用伪Call
:
@Echo Off
SetLocal EnableDelayedExpansion
Set "FILENAME=456_789_ABC00011092_789_EFGHIK_56893.mpg"
For %%A In ("%FILENAME:_=" "%") Do (
Set "TEN=%%A"
Echo. !AB!
Set "remove_1=ABC"
Echo !remove_1!
Call Set "_TEN=!TEN:%%remove_1%%=!"
Echo !_TEN!
Set "i=0"
If "!_TEN!" NEq "!TEN!" (
Set /A i+=1
Set "String[!i!]=%%~A"
)
)
Pause
Exit /B
在您的第二个相关问题中,最初发布为答案,现在已添加为原始问题的修改;因为循环中的错误级别为set
,(代码块),您应该使用延迟扩展语法!errorlevel!
@Echo Off
SetLocal EnableDelayedExpansion
Set "FILENAME=456_789_ABC00011092_789_EFGHIK_56893.mpg"
For %%A In ("%FILENAME:_=" "%") Do (
Echo %%A | FindStr /IRC:"ABC" >Nul
Echo !errorlevel!
If "!errorlevel!"=="0" (
Set /A i+=1
Set "String[!i!]=%%~A"
)
)
Set String[
Pause
Exit /B
或者,如果您不需要Echo
每个错误级别到屏幕,您可以使用条件语句&&
:
@Echo Off
SetLocal EnableDelayedExpansion
Set "FILENAME=456_789_ABC00011092_789_EFGHIK_56893.mpg"
For %%A In ("%FILENAME:_=" "%") Do (
Echo %%A | FindStr /IRC:"ABC" >Nul && (
Set /A i+=1
Set "String[!i!]=%%~A"
)
)
Set String[
Pause
Exit /B