#if-statement #batch-file #syntax
#если-заявление #пакетный файл #синтаксис
Вопрос:
У меня есть следующий код (в пакетном режиме) для тестирования части большего кода, который не работает:
@echo off set /a slotted55=8 set /a place=55 set /a key3=8 set /a key1=0 set /a key2=0 set /a key4=0 set /a key5=0 set /a key6=0 set /a strike=0 if %place%==55 ( if %key1%==%slotted55% ( set key1=V set slotted55=V goto 5x5one ) else ( if %key2%==%slotted55% ( set key2=V set slotted55=V goto 5x5one ) ) else ( if %key3%==%slotted55% ( set key3=V set slotted55=V goto 5x5one ) ) else ( if %key4%==%slotted55% ( set key4=V set slotted55=V goto 5x5one ) ) else ( if %key5%==%slotted55% ( set key5=V set slotted55=V goto 5x5one ) ) else ( if %key6%==%slotted55% ( set key6=V set slotted55=V goto 5x5one ) ) else ( set /a strike=%strike% 1 if %strike%==3 goto gameover set %slotted55%=X goto 5x5one ) ) :gameover echo gameover pause exit :5x5one echo good pause
По какой — то причине он продолжает ломаться. Я рассмотрел множество других вопросов, но ни один из них, похоже, не подходит для этой ситуации. Все переменные кажутся правильными, и нет отсутствующих операндов, но это не похоже на то, что пакет выдает вам сообщение об ошибке. Кто-нибудь может мне помочь?
Комментарии:
1. Вам вообще не нужно ни одно из этих
else
утверждений.
Ответ №1:
Как я уже сказал в своем комментарии, вам не требуется никаких else
утверждений, также как и в вашем вступительном if
заявлении else
, вы должны начать с использования противоположного сравнения, таким образом, чтобы все не было вложено в один набор скобок.
@Echo Off SetLocal EnableExtensions Set "place=55" Set /A "key3=slotted55=8" Set /A "key1=key2=key4=key5=key6=strike=0" If "%place%" NEq "55" GoTo gameover If "%key1%" == "%slotted55%" ( Set "key1=V" Set "slotted55=V" GoTo 5x5one ) If "%key2%" == "%slotted55%" ( Set "key2=V" Set "slotted55=V" GoTo 5x5one ) If "%key3%" == "%slotted55%" ( Set "key3=V" Set "slotted55=V" GoTo 5x5one ) If "%key4%" == "%slotted55%" ( Set "key4=V" Set "slotted55=V" GoTo 5x5one ) If "%key5%" == "%slotted55%" ( Set "key5=V" Set "slotted55=V" GoTo 5x5one ) If "%key6%" == "%slotted55%" ( Set "key6=V" Set "slotted55=V" GoTo 5x5one ) Set /A strike = 1 If %strike% Equ 3 GoTo gameover Set "slotted55=X" GoTo 5x5one :gameover Echo gameover Pause Exit /B :5x5one Echo good Pause
Комментарии:
1. Спасибо! Это действительно помогло!
Ответ №2:
Из-за того, где вы поставили свои )
«с», все ваши else
утверждения смотрят друг на друга, а не на другие if
утверждения, которые вы написали. Прямо сейчас ваша логика выглядит примерно так:
if "%x%"=="5" ( echo X is 5 ) else ( echo X is not 5 ) else ( echo X is somehow neither 5 nor is it not 5 )
Если вы объедините свое else
со следующим if
, ваша логика снова обретет смысл.
set /a strike=0 if %place%==55 ( if %key1%==%slotted55% ( set key1=V set slotted55=V goto 5x5one ) else if %key2%==%slotted55% ( set key2=V set slotted55=V goto 5x5one ) else if %key3%==%slotted55% ( set key3=V set slotted55=V goto 5x5one ) else if %key4%==%slotted55% ( set key4=V set slotted55=V goto 5x5one ) else if %key5%==%slotted55% ( set key5=V set slotted55=V goto 5x5one ) else if %key6%==%slotted55% ( set key6=V set slotted55=V goto 5x5one ) else ( set /a strike=%strike% 1 if %strike%==3 goto gameover set %slotted55%=X goto 5x5one ) )
Ответ №3:
Здесь вы работаете с увеличивающимися числами, вы можете просто использовать цикл for и иметь один оператор if внутри for
цикла:
@echo off setlocal enabledelayedexpansion set /a slotted55=8, place=55, key3=8, key1=0, key2=0, key4=0, key5=0, key6=0, strike=0 if %place% neq %slotted55% goto :gameover for /L %%i in (1,1,6) do ( if !key%%i! equ %slotted55% ( set "key%%i=V" set "slotted55=V" goto :5x5one ) ) :gameover set /a strike =1 if %strike% equ 3 ( echo gameover pause exit ) set "slotted55=X" :5x5one echo good pause
На данный момент, похоже, здесь чего-то не хватает, хотя вы никогда не достигнете strike=3
, если у вас не будет goto
возможности вернуться в цикл. Таким образом, этот код будет работать так же, как и ваш, без всех else
инструкций.