Как использовать% или!в пакетном скрипте - PullRequest
0 голосов
/ 01 июня 2018

Я пишу сценарий так:

@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 голосов
/ 01 июня 2018

%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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...