1

そのため、現在の仮想マシンが既に存在する場合、現在の仮想マシンを上書きするかどうかをユーザーに尋ねようとしています。問題を再現するために、この .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 に戻る前の入力が常に取得されます。どうして??

4

1 に答える 1

3

あなたの問題は、遅延拡張を有効にしようとしているにもかかわらず (をsetlocal enabledelayedexpansion使用して)、実際には使用していないことです。

%var%遅延展開をオンにしても、通常の可変展開です。

!var!遅延変数展開に使用する必要があります。(たとえば)ここの「ドキュメント」を参照してください。

于 2016-08-11T01:38:41.607 に答える