Hvis erklæring i Windows Batch-fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har været fast på dette dumme hvis erklæring, uanset hvad jeg gør, jeg kan ikke få den hvis erklæring til at gå til den korrekte etiket.



  1. Hvis du trykker på 'y', stoppes cmd-prompt ved START DEPLOY

  2. MEN hvis jeg skriver 'n' cmd udskrifter START DEPLOY går så til ende i stedet for at gå direkte til annulleringsetiketten.



Kan du hjælpe?


: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

Bedste reference


Prøv dette:


@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

Andre referencer 1


Hvis vi ignorerer det faktum, at det krævede input var y. eller n. (på grund af. i sammenligningen), bemærkede ingen det faktiske problem med c14kaa s script (bortset fra Nick DeVore men sagde ikke hvorfor). Det originale script havde linjen


set/p confirmDeploy=Bekræft implementering af kode [[y/n]]?:


Nick nævnte, at dette ikke satte svaret i variablen. Det skyldes, at det var at sætte svaret i 'confirmDeploy' (rummet er en del af variablenavnet, bare et andet eksempel på cmd's input parsing). Således, da c14kaa brugte\% confirmDeploy\%, ville det have udvidet til\% confirmDeploy\% ( dvs. er blevet taget bogstaveligt), medmindre denne variabel var blevet fastsat andetsteds. Jeg kan kun antage, at c14kaa havde slukket ekko, fordi det faktum at confirmDeploy ikke erstattede (eller indeholdt noget andet end y eller n) ville have været en stor anelse. har også afsløret problemet med. i if-erklæringen.


Hvad angår de andre forslag, er det at foretrække at '' stoppe syntaxfejl, når variablen er tom (genererer sætningen 'hvis == y', hvad der betyder 'failing' ): før etikettenavnet i goto ignoreres, og der skal være et mellemrum efter/I i John's version (selvom kommandoen if har kun en mulighed, har nogle kommandoer mange og de kan sættes sammen som i 'findstr/ivn ...' så pladsen markerer slutningen af ​​listen).


Den eneste anden kommentar jeg ville gøre er, at c14kaa antager, at brugeren altid vil indtaste det korrekte svar (y eller n), fordi ellers vil scriptet 'falde igennem' ind i: deployCode-sektionen (sandsynligvis ikke den ideelle standardadfærd). Dette forklarer svaret modtaget af Matt (ekko dårlig input). Da svaret blev sat i confirmDeploy < space>, betød det, at begge tests (ved hjælp af confirmDeploy uden mellemrummet) mislykkedes.


Ved at tage alle ovenstående over, forlader vi Reny's version (med nogle forklaringer tilføjet).

Andre referencer 2


Du er på rette spor, bare brug for at rydde op syntax og mellemrum fejl. Dette vil fungere:


@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

Andre referencer 3


Problemet er, at ingen af ​​dine tests virker. Du kontrollerer, at brugeren indtaster noget som y. eller n. (men jeg tror ikke, du kan faktisk indtaste noget, der passer til hinanden).


Prøv med:


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

...

Andre referencer 4


prøv også dette:


@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


Argumentet/I gør det uhensigtsmæssigt.