如何在不使用选择和设置 /p 的情况下直接获取 y/n 按键

How to get the y/n key press directly without using choice and set /p

我试图在不使用 choiceset /p 的情况下获得 y/n 按键。我这样使用 del

@echo off
copy /y nul $~temp.txt
del /p $~temp.txt >nul
if exist $~temp.txt (
  echo/
  echo You pressed y.
) else (
  echo/
  echo You pressed n.
)
pause >nul

不直接按键。之后我们必须按回车键。任何不按回车键的方法都值得赞赏。

经过一些研究,我发现使用 sc:

@echo off
sc /? >temp.txt
for %%a in (temp.txt) do (
  if %%~za equ 4822 ( 
    echo You pressed y.
  ) else (
    echo You pressed n.
  )
)
pause >nul

这对我有用,因为 sc 帮助屏幕中有一个直接的 y/n 按键提示。

您可以(误)使用xcopy,它在指定/W选项时提示是否继续复制; /L 开关可防止任何内容被实际复制:

@echo off
rem // Capture first line of output of `xcopy /W`, which contains the pressed key:
for /F "delims=" %%K in ('
    xcopy /W /L "%~f0" "%TEMP%"
') do set "KEY=%%K" & goto :NEXT
:NEXT
rem // Extract last character from captured line, which is the pressed key:
set "KEY=%KEY:~-1%"
rem // Return pressed key:
echo You pressed "%KEY%".

rem // Check pressed key (example):
if /I not "%KEY%"=="Y" if /I not "%KEY%"=="N" >&2 echo You pressed an unexpected key!

或者,您可以(误)使用 replace,当指定 /W 选项时会提示是否继续替换; /U 开关可防止在源和目标相同时实际复制任何内容:

@echo off
rem // Capture second line of output of `replace /W`, which is the pressed key:
for /F "skip=1 delims=" %%K in ('
    replace /W /U "%~f0" "."
') do set "KEY=%%K" & goto :NEXT
:NEXT
rem // Return pressed key:
echo You pressed "%KEY%".

rem // Check pressed key (example):
if /I not "%KEY%"=="Y" if /I not "%KEY%"=="N" >&2 echo You pressed an unexpected key!

我不得不承认,我不记得 replace 在 Windows XP 上是否可用。