变量不是第一次从批处理脚本中的输入分配

Variable not being assigned first time from input in a batch script

所以我试图询问用户是否要覆盖当前的虚拟机(如果已经存在)。我已将此 .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

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

问题是它没有这样做!它似乎没有设置 machineOverwrite 变量,因此它进入 "you did not enter y or n" 部分。从这里回到起点,重新经过

真正奇怪的是,下次你通过时,如果你选择 "y",它会按照它的意思去做!但是,如果您选择 "n",它仍然可以使用 "y"!

每次我输入任何内容时,它总是在返回到 :checkOverwrite 之前获取输入,而不是最新的输入。为什么??

您的问题是,尽管尝试启用延迟扩展(使用 setlocal enabledelayedexpansion),但您实际上并没有使用它。

%var%是正常的变量扩展,即使打开了延迟扩展。

您需要使用!var!进行延迟变量扩展。参见(例如)"documentation" here.