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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用%或!在批处理脚本中相关的知识,希望对你有一定的参考价值。

我写这样的脚本:

@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

答案

%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

以上是关于如何使用%或!在批处理脚本中的主要内容,如果未能解决你的问题,请参考以下文章

XCode 中代码签名“调试”或“发布”的意义何在?

如何查看sql server中代码创建的临时表?

如何测量设备+OpenCL+GPU中代码的执行时间

Tutorial中代码的区别及不同效果

如何测量python中代码行之间的时间?

关于Java中异常的叙述正确的是:( ) A.异常是程序编写过程中代码的语法错误