そのため、現在の仮想マシンが既に存在する場合、現在の仮想マシンを上書きするかどうかをユーザーに尋ねようとしています。問題を再現するために、この .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 が常に true として返され (この場合、これらの変数は決して等しくないため)、そこから、マシンを上書きするかどうかを尋ねます。彼らが「y」と言うと、「上書き」と表示され、任意のキーを押して続行します...
問題はそれをしていないことです!machineOverwrite 変数を設定しているようには見えないため、「y または n を入力しませんでした」セクションに進んでいます。ここから最初に戻り、またスルーします。
本当に奇妙なことは、次に通過するときに「y」を選択すると、意図したとおりに実行されることです! ただし、「n」を選択しても、「y」で行うべきことは実行されます。
何かを入力するたびに、最新の入力ではなく、:checkOverwrite に戻る前の入力が常に取得されます。どうして??