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

问题描述 投票:0回答:1

我写这样的脚本:

@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

windows batch-file cmd
1个回答
0
投票

%AB%尚未在您发布的脚本中定义,因此没有值将不会被echoed,因为.之后的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
© www.soinside.com 2019 - 2024. All rights reserved.