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