如何使用%或!在批处理脚本中
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%
尚未在您发布的脚本中定义,因此没有值将不会被echo
ed,因为.
之后的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
以上是关于如何使用%或!在批处理脚本中的主要内容,如果未能解决你的问题,请参考以下文章