如果在Windows批处理文件中声明

时间:2012-03-27 10:32:03

标签: windows batch-file cmd

我一直坚持这个愚蠢的if语句,无论我做什么,我都无法得到if语句去正确的标签。

  1. 点击'y'有效,cmd-prompt在START DEPLOY
  2. 停止
  3. 但是,如果我输入'n'cmd打印START DEPLOY然后转到结束,而不是直接转到取消标签。
  4. 你能帮忙吗?

    :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 个答案:

答案 0 :(得分:16)

试试这个:

@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

答案 1 :(得分:3)

如果我们忽略了所需输入为y的事实。或者(由于。比较中的。),没有人注意到c14kaa脚本的实际问题(除了Nick DeVore,但没有说明原因)。原始脚本有行

set / p confirmDeploy =确认代码[y / n]的部署?:

Nick提到这并未将响应放入变量中。那是因为它将响应放入“confirmDeploy”(空间是变量名称的一部分,只是cmd输入解析的另一个缺点)。因此,当c14kaa使用%confirmDeploy%时,它将扩展到%confirmDeploy%(即字面意思),除非该变量已在其他地方设置。我只能假设c14kaa已关闭回声,因为confirmDeploy没有替代(或包含y或n以外的东西)的事实将是一个很大的线索。它本来也揭示了问题。在if语句中。

至于其他建议,当变量为空时,在变量周围加上“”(因此需要在匹配字符串中)是首选,以停止语法错误(生成语句'if == y',jeb表示的意思是“失败”),:在goto中的标签名称被忽略之前,在John的版本中/ I之后需要有一个空格(即使if命令只有一个选项,一些命令有很多,它们可以放在像“findstr / ivn ...”这样的空格一起标记列表的结尾。

我要做的唯一其他评论是c14kaa假定用户将始终输入正确的响应(y或n),否则脚本将“落入”:deployCode部分(可能不是理想的默认行为) 。这解释了Matt对该建议的回应(回声不良输入)。由于响应被放入confirmDeploy< space>这意味着两个测试(使用confirmDeploy没有空格)都失败了。

考虑到上述所有内容,我们留下了Reny的版本(添加了一些解释)。

答案 2 :(得分:1)

你是在正确的轨道上,只需要清理语法和间距错误。这将有效:

@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

答案 3 :(得分:0)

问题是你的测试都没有效果。您正在检查用户输入y.n.之类的内容(但我认为您实际上无法输入任何匹配的内容)。

尝试:

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

...

答案 4 :(得分:0)

试试这个:

@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参数使其不区分大小写。