Если заявление в пакетном файле Windows - PullRequest
4 голосов
/ 27 марта 2012

Я застрял в этом глупом утверждении if, что бы я ни делал, я не могу заставить утверждение if перейти на правильный ярлык.

  1. Нажатие 'y' работает, cmd-приглашение останавливается при START DEPLOY
  2. НО, если я наберу 'n' cmd печатает START DEPLOY, то идет к концу, вместо того, чтобы идти прямо к метке отмены.

Вы можете помочь?

:getConfirmation
set /p confirmDeploy =Confirm deployment of code [y/n] ?: 
if "%confirmDeploy%"=="y". goto deployCode
if "%confirmDeploy%"=="n". goto cancelDeploy

:deployCode
ECHO START DEPLOY
goto end

:cancelDeploy
ECHO DEPLOY CANCELLED
goto end

Ответы [ 5 ]

16 голосов
/ 27 марта 2012

Попробуйте это:

@echo off
:getConfirmation
set /p confirmDeploy=Confirm deployment of code [y/n] ?: 
if %confirmDeploy%==y goto :deployCode
if %confirmDeploy%==n goto :cancelDeploy

:deployCode
ECHO START DEPLOY
goto end

:cancelDeploy
ECHO DEPLOY CANCELLED
goto end
3 голосов
/ 02 апреля 2015

Если мы игнорируем тот факт, что необходим ввод был y.или нет.(из-за. в сравнении if) никто не заметил фактической проблемы со скриптом c14kaa (кроме Ника ДеВора, но не сказал почему).В исходном сценарии была строка

set / p verifyDeploy = Подтверждение развертывания кода [y / n]?:

Ник упомянул, что это не помещает ответ в переменную.Это потому, что он помещал ответ в «verifyDeploy» (пробел является частью имени переменной, просто еще одна слабость разбора ввода cmd).Таким образом, когда c14kaa использовал% verifyDeploy%, он расширился бы до% verifyDeploy% (т.е. был взят буквально), если бы эта переменная не была установлена ​​в другом месте.Я могу только предположить, что c14kaa отключил эхо, потому что тот факт, что verifyDeploy не заменял (или содержал что-то кроме y или n), был бы большой подсказкой.Это также выявило бы проблему с.в операторе if.

Что касается других предложений, наличие "" вокруг переменной (и, следовательно, необходимость в соответствующей строке) предпочтительнее для остановки синтаксических ошибок, когда переменная пуста (генерирует инструкцию 'if == y ', что означает jeb под "неудачей"),: перед именем метки в goto игнорируется и должен быть пробел после / I в версии Джона (хотя команда if имеет только одну опцию, некоторыекоманд много, и их можно собрать вместе, например, в «findstr / ivn ...», чтобы пробел отмечал конец списка).

Единственный другой комментарий, который я хотел бы сделать, заключается в том, что c14kaa предполагает, что пользователь всегда будет вводить правильный ответ (y или n), потому что в противном случае скрипт «провалится» в раздел: deployCode (возможно, не идеальный).поведение по умолчанию).Это объясняет ответ, полученный Мэттом на предложение (неверный эхо-ввод).Поскольку ответ был помещен в verifyDeploy , это означало, что оба теста (с использованием verifyDeploy без пробела) не пройдены.

Принятие всего вышеперечисленного оставляет нас с версией Рени (с некоторыми добавленными пояснениями).

1 голос
/ 17 ноября 2013

Вы на правильном пути, просто необходимо устранить синтаксические и пробельные ошибки. Это будет работать:

@echo off  
:getConfirmation  
set /p confirmDeploy=Confirm deployment of code [y/n] ?:   
if /I "%confirmDeploy%"=="y" goto deployCode  
if /I "%confirmDeploy%"=="n" goto cancelDeploy  
REM added goto getConfirmation in case of invalid responses  
goto getConfirmation

:deployCode  
ECHO START DEPLOY  
goto end  

:cancelDeploy  
ECHO DEPLOY CANCELLED  
goto end
0 голосов
/ 08 июня 2013

попробуйте тоже:

@echo off
:getConfirmation
set /p confirmDeploy=Confirm deployment of code [y/n] ?: 
if /I%confirmDeploy%==y goto :deployCode
if /I%confirmDeploy%==n goto :cancelDeploy

:deployCode
ECHO START DEPLOY
goto end

:cancelDeploy
ECHO DEPLOY CANCELLED
goto end

Аргумент / I делает его нечувствительным к регистру.

0 голосов
/ 27 марта 2012

Проблема в том, что ни один из ваших тестов не работает. Вы проверяете, вводит ли пользователь что-то вроде y. или n. (но я не думаю, что вы можете ввести что-либо, что будет соответствовать).

Попробуйте с:

if "%confirmDeploy%".=="y". goto deployCode
if "%confirmDeploy%".=="n". goto cancelDeploy
echo bad input
goto getConfirmation

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...