第一次提示时无法识别用户输入,windows 批次

User input not recognized first time its prompted, windows batch

我目前正在尝试制作一个简单的批处理文件,它将检查我是否安装了 Node.js,如果我安装了它,它会告诉我版本,如果我没有安装,我将被提示通过本地安装文件。这是代码:

@echo off

set "output=0"
for /f "delims=" %%i in ('node -v 2^>nul') do set output=%%i

if %output%==0 (
echo Node not installed.

:start
SET /p choice=Would you like to installed Node? [Y/N]: 
IF '%choice%'=='Y' GOTO yes
IF '%choice%'=='y' GOTO yes
IF '%choice%'=='N' GOTO no
IF '%choice%'=='n' GOTO no
ECHO "%choice%" is not valid
ECHO.
GOTO start

:no
ECHO Not installing Node.
PAUSE
EXIT

:yes
ECHO Installing node...
CALL node-v16.15.0-x64.msi
ECHO Installed Node version:
CALL node -v
PAUSE
EXIT

) else (
echo Installed Node version:
call node -v
) 
pause

当运行在未安装节点的电脑上安装bat文件时,它会提示用户输入Y或N。无论用户第一次输入什么,输入总是空(如“”),然后它将再次启动 GOTO,这一次用户输入被确认为无论输入是什么,无论用户输入什么选择,都会继续 GOTO。

目前我无法解决可能导致此问题的原因,我以前没有使用过批处理文件。我试图在网上找到答案,但我不知道如何搜索这个问题,因为我不熟悉所谓的或指的是什么东西。感谢任何帮助。

编辑:如果我在代码中隔离用户输入场景,它似乎可以正确确认用户输入。本质上,如果我不检查节点安装而只检查 运行 用户输入,它就可以工作。似乎是节点安装检查影响了用户输入。

您有两个主要问题:

  1. 缺少 delayedexpansion(我最初将其作为重复关闭,但意识到您仍然有问题,没有解释)

  2. 您不能 goto 代码块内的标签。但是,如果您稍微更改一下逻辑,则不需要上述任何内容。我们将使用 choice 作为选择菜单的工具。然后,无需使用 for 循环,因为您可以简单地恢复到命令 node -v:

    errorlevel
@echo off

node -v && goto :VER || echo Node not installed

choice /c YN /M "Install Node?"
if errorlevel 2 (
    echo Not installing Node.
    pause
    exit /b
)

echo Installing node...
call node-v16.15.0-x64.msi

:VER
echo Installed Node version:
call node -v

pause