Тема: CMD/BAT: Странная совместная работа SHIFT + IF
Два скрипта, одна логика и разные результаты
Скрипт 1 (bug1.bat)
@echo off
if not "%~1" == "A" goto not_A
set BUG_A=1
shift /1
if not "%~1" == "B" goto not_B
set BUG_B=1
shift /1
:not_B
set BUG_C=1
:not_A
set BUG
.
Скрипт 2 (bug2.bat)
@echo off
if "%~1" == "A" (
set BUG_A=1
shift /1
if "%~1" == "B" (
set BUG_B=1
shift /1
)
set BUG_C=1
)
set BUG
.
А теперь запустим их:
C:\tmp>bug1 A
BUG_A=1
BUG_C=1C:\tmp>bug1 A B
BUG_A=1
BUG_B=1
BUG_C=1C:\tmp>bug2 A
BUG_A=1
BUG_C=1C:\tmp>bug2 A B
BUG_A=1
BUG_C=1
Мне не понятно, почему во втором скрипте SHIFT /1 не влияет на проверяемый аргумент во втором сравнении. Чтобы исправить проблему приходится писать так (вот втором и третьем скриптах различие только во втором сравнении):
Скрипт 3 (bug3.bat)
@echo off
if "%~1" == "A" (
set BUG_A=1
shift /1
if "%~2" == "B" (
set BUG_B=1
shift /1
)
set BUG_C=1
)
set BUG
.
Тогда логика верна:
C:\tmp>bug3 A
BUG_A=1
BUG_C=1C:\tmp>bug3 A B
BUG_A=1
BUG_B=1
BUG_C=1