Синтаксис блока пакетной инструкции IF

#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 инструкций.