在批处理脚本

时间:2016-08-11 01:21:05

标签: variables batch-file input unassigned-variable

所以我试图询问用户是否要覆盖当前虚拟机(如果已存在)。我已将此.bat文件的问题部分解压缩到一个单独的文件中以复制问题。

此文件中的代码为:

@echo off
@setlocal enabledelayedexpansion

SET test=blah
SET existingMachines=blahsdg

:checkOverwrite
if not "%test%"=="%existingMachines%" (
    SET /P machineOverwrite="A machine containing this name already exists. Do you want to overwrite it (y/n)? "
    if /I "%machineOverwrite%"=="y" (
        echo overwrite
    ) else (
        if /I "%machineOverwrite%"=="n" (
            echo You will need to choose a new name for your virtual box or overwite the existing one.
        ) else (
            echo WARNING: You did not enter y or n
            GOTO :checkOverwrite
        )
    )
)

pause

这个概念是第一个,如果永远会回归真实(因为这些变量在这种情况下永远不会相等),并且从那里它会询问是否要覆盖机器。如果他们说" y",你应该看到"覆盖"然后按任意键继续......

问题是它没有这样做!它似乎没有设置machineOverwrite变量,因此它会进入"你没有输入y或n"部分。从这里开始,它会重新开始,然后重新开始。

真正奇怪的是,下次你经历的时候,如果你选择" y",它就是它的意思!但是,如果你选择" n",它仍然可以用#34; y"!

每当我输入任何内容时,它总是在返回之前获得输入:checkOverwrite而不是最新输入。 WHY ??

1 个答案:

答案 0 :(得分:2)

您的问题是,尽管尝试启用延迟扩展(使用%var%),但您实际上并未使用它。

!var!是正常的变量扩展,即使启用延迟扩展也是如此。

您需要使用Prelude> :set +m Prelude> let removeOdds nums = Prelude| if null nums Prelude| then [] Prelude| else Prelude| if (mod (head nums)/2) == 0 Prelude| then (head nums) : (removeOdds(tail nums)) Prelude| else removeOdds(tail nums) Prelude| 进行延迟变量扩展。请参阅(例如)“文档”here