基本上我的文件夹中有 12 个文件,每个文件都有一个月的名称作为后缀。前 3 个字符。用户将输入月份,该月份将存储在变量中,与其他字符连接起来形成文件名,并且将选择该文件来执行。
获取输入的最基本方法是这样做:
set /P var123="Enter some value: "
然后,您可以像这样使用变量
var123
:
echo %var123%
set /p "var=user prompt text "
echo %var%
是通常的方式。缺点是变量的内容很难正确验证,因为您的用户可能会键入任何内容作为响应。另请注意,单独按下
set /p
不会更改 var
id 的值 Enter。通常先用 var
清除 set "var="
是正常的,也可以用 set "var=default"
作为默认选择。事实上,
set "var=default"
set /p "var=[%var%] "
可用于提示默认值。
另一种方法是使用
choice
echo 1. January
...
echo 9. September
echo o. October
echo n. November
echo d. December
choice /C 123456789ond
将根据所做的选择将
errorlevel
设置为 1 到 12。
(还有其他选项 - 请参阅提示中的
choice /?
)
此方法的优点是它只会对列出的选项之一做出反应,输入只需 1 个键,如果用户在可编程时间内没有响应,您还可以指定要选择的默认值。
此批处理文件使用命令 CHOICE(如果可用)(Windows Vista 和更高版本的 Windows 版本、Windows Server 2003 和更高版本的 Windows Server 版本)或带有选项 /P
的命令
SET来提示用户十二个月之一。
@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 是首选,因为它是为选择菜单设计的。用户无法输入批处理脚本作者不需要的内容,因此通过使用分配给变量
choice.exe
的退出代码 errorlevel
来评估用户选择很简单。
在 Windows XP 和以前的 Windows 版本上按要求使用命令 SET 和选项
/P
会出现更多问题,因为用户可以自由输入任何字符串,从空字符串到可能导致恶意代码执行的字符串批处理脚本作者并没有阻止这种情况。为了安全地确保用户确实输入了 1
到 12
范围内的数字,还需要许多其他命令。
与上面相同的批处理脚本仅使用 CHOICE,这意味着与 Windows XP 不兼容(除了 Windows Server 2003 中的
choice.exe
被复制到 Windows XP 系统目录)甚至更旧的 Windows 版本。
@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
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
choice /?
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?