首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bat脚本中接受用户输入?

如何在bat脚本中接受用户输入?
EN

Stack Overflow用户
提问于 2021-01-05 03:40:22
回答 2查看 564关注 0票数 0

基本上,我的文件夹中有12个文件,每个文件的月份名称都是一个后缀。前3个字符。用户将输入月份,该月份将存储在一个变量中,并与其他字符连接形成一个文件名,该文件将被选择执行。

EN

回答 2

Stack Overflow用户

发布于 2021-01-05 17:30:55

此批处理文件使用命令CHOICE (如果可用) (Windows Vista和更新的Windows版本、Windows Server 2003和更新的Windows Server版本)或命令SET和选项/P来提示用户12个月中的一个月。

代码语言:javascript
复制
@echo off
setlocal EnableExtensions DisableDelayedExpansion
echo/
echo    1 ... January
echo    2 ... February
echo    3 ... March
echo    4 ... April
echo    5 ... May
echo    6 ... June
echo    7 ... July
echo    8 ... August
echo    9 ... September
if exist %SystemRoot%\System32\choice.exe (
    echo    O ... October
    echo    N ... November
    echo    D ... December
) else (
    echo   10 ... October
    echo   11 ... November
    echo   12 ... December
)
echo/
if not exist %SystemRoot%\System32\choice.exe goto MonthPrompt
%SystemRoot%\System32\choice.exe /C 123456789OND /N /M "Please select month:"
set "Month=%Errorlevel%"
goto GetMonth

:MonthPrompt
set "Month="
set /P "Month=Please select month: "
rem Prompt the user again if nothing input by the user.
if not defined Month goto MonthPrompt
rem Remove all double quotes.
set "Month=%Month:"=%"
rem Prompt the user again if just double quotes were input by the user.
if not defined Month goto MonthPrompt
rem Prompt the user again if user input contains a non-digit character.
for /F delims^=0123467890^ eol^= %%I in ("%Month%") do goto MonthPrompt
rem Remove all leading zeros.
for /F "tokens=* delims=0" %%I in ("%Month%") do set "Month=%%I"
rem Prompt the user again if user input was just one or more 0.
if not defined Month goto MonthPrompt
rem Prompt the user again if input number is greater than 12.
if %Month% GTR 12 goto MonthPrompt

:GetMonth
for %%I in ("1 JAN" "2 FEB" "3 MAR" "4 APR" "5 MAY" "6 JUN" "7 JUL" "8 AUG" "9 SEP" "10 OCT" "11 NOV" "12 DEC") do for /F "tokens=1,2" %%J in (%%I) do if %%J == %Month% set "Month=%%K" & goto BuildFileName

:BuildFileName
echo Selected month: %Month%

endlocal

命令 choice 可用,因为它是为选项菜单设计的。用户不能输入批处理脚本作者不需要的内容,因此通过使用分配给变量errorlevelchoice.exe退出代码,可以很容易地评估用户的选择。

在Windows和以前的Windows版本中,使用带有选项/P的命令SET存在更多问题,因为用户可以自由输入任何字符串,从空字符串到空字符串,这可能导致在批处理脚本作者上执行恶意代码。有许多额外的命令需要安全地确保用户在112的范围内输入了一个数字。

上面的批处理脚本只使用CHOICE,这意味着与Windows XP不兼容(除了Windows Server2003中的choice.exe被复制到Windows XP系统目录中),甚至更早的Windows版本。

代码语言:javascript
复制
@echo off
setlocal EnableExtensions DisableDelayedExpansion
echo/
echo    1 ... January
echo    2 ... February
echo    3 ... March
echo    4 ... April
echo    5 ... May
echo    6 ... June
echo    7 ... July
echo    8 ... August
echo    9 ... September
echo    O ... October
echo    N ... November
echo    D ... December
echo/
%SystemRoot%\System32\choice.exe /C 123456789OND /N /M "Please select month:"
set "Month=%Errorlevel%"
for %%I in ("1 JAN" "2 FEB" "3 MAR" "4 APR" "5 MAY" "6 JUN" "7 JUL" "8 AUG" "9 SEP" "10 OCT" "11 NOV" "12 DEC") do for /F "tokens=1,2" %%J in (%%I) do if %%J == %Month% set "Month=%%K" & goto BuildFileName

:BuildFileName
echo Selected month: %Month%

endlocal

要了解使用的命令及其工作原理,请打开一个command prompt窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • choice /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
票数 1
EN

Stack Overflow用户

发布于 2021-05-20 23:41:14

获取输入的最基本方法是这样做:

代码语言:javascript
复制
set /P var123="Enter some value: "

然后,您可以像这样使用to变量var123

代码语言:javascript
复制
echo %var123%
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65568800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档