如何使用%或!在批处理脚本中

时间:2018-06-01 02:31:43

标签: windows batch-file cmd

我写这样的脚本:

@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

1 个答案:

答案 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