Windows 如何使用%or!批处理脚本

Windows 如何使用%or!批处理脚本,windows,batch-file,cmd,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%

我这样写剧本:

@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
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"
        )
    )
为什么
echo.%AB%
echo.%删除1%
结果为

我将
%
替换为
。工作正常,但命令
Set\u TEN=!十:!移除_1!=不运行


编辑-(来自当前作为答案发布的附加问题)

当我像这样使用FindStr命令时:

@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
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
always=
0

未在您发布的脚本中定义,因此它没有任何值将不会被
echo
编辑,因为
echo
之后的
将只得到一个空行。因为
remove_1
是在循环(代码块)中设置的,所以应该使用延迟扩展语法
Echo!移除_1。这与
echo相同_10%
,即
回音_十个,并且应该是
Echo!AB以前已经定义过。为了获得
设置
变量所需的双重扩展,可以使用伪
调用

@Echo关闭
SetLocal EnableDelayedExpansion
设置“文件名=456_789_ABC00011092_789_EFGHIK_56893.mpg”
对于中的%%A(“%FILENAME:\=”“%”),请执行以下操作(
设置“十=%%A”
回声!AB!
设置“删除\u 1=ABC”
回声!移除1!
调用集“\u TEN=!TEN:%%删除\u 1%%=!”
回声!
设置“i=0”
如果“!\u十!”NEq“!十!”(
设置/A i+=1
设置“字符串[!i!]=%%~A”
)
)
暂停
退出/B
在第二个相关问题中,最初作为答案发布,现在作为原始问题的编辑添加;因为错误级别是在循环(代码块)中设置的,所以应该使用延迟扩展语法,
!错误等级

@Echo关闭
SetLocal EnableDelayedExpansion
设置“文件名=456_789_ABC00011092_789_EFGHIK_56893.mpg”
对于中的%%A(“%FILENAME:\=”“%”),请执行以下操作(
Echo%%A | FindStr/IRC:“ABC”>Nul
回声!错误等级!
如果“!errorlevel!”==“0”(
设置/A i+=1
设置“字符串[!i!]=%%~A”
)
)
设置字符串[
暂停
退出/B
或者,如果不需要将每个错误级别
回显到屏幕上,可以使用条件语句
&&

@Echo关闭
SetLocal EnableDelayedExpansion
设置“文件名=456_789_ABC00011092_789_EFGHIK_56893.mpg”
对于中的%%A(“%FILENAME:\=”“%”),请执行以下操作(
Echo%%A|FindStr/IRC:“ABC”>Nul&&(
设置/A i+=1
设置“字符串[!i!]=%%~A”
)
)
设置字符串[
暂停
退出/B

%AB%
未在您发布的脚本中定义,因此它没有值将不会被
echo
编辑,因为
echo
之后的
,您只会得到一个空行。因为
remove\u 1
是在循环中设置的,(代码块),您应该使用延迟扩展语法,
Echo!remove_1!
。这与
Echo.%\u TEN%
相同,即
Echo!\u TEN!
。谢谢。现在,我了解了如何在循环中使用变量。我应该使用哪个脚本?