Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何在bat脚本中接受用户输入?_Batch File - Fatal编程技术网

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

Batch file 如何在bat脚本中接受用户输入?,batch-file,Batch File,基本上我的文件夹里有12个文件,每个文件都有一个月的名字作为后缀。前3个字符。用户将输入月份,该月份将存储在一个变量中,并与其他字符连接以形成文件名,该文件将被选择执行 set /p "var=user prompt text " echo %var% 这是通常的方式。缺点是变量的内容很难正确验证,因为用户可能会键入任何响应。另外,请注意,set/p不会改变按下varid单独输入时的值。使用set“var=“首先清除var是正常的,也可以使用set“var=default”

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

set /p "var=user prompt text "
echo %var%
这是通常的方式。缺点是变量的内容很难正确验证,因为用户可能会键入任何响应。另外,请注意,
set/p
不会改变按下
var
id单独输入时的值。使用
set“var=“
首先清除
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键,并且如果用户在可编程时间内没有响应,您还可以指定要选择的默认值

这是通常的方式。缺点是变量的内容很难正确验证,因为用户可能会键入任何响应。另外,请注意,
set/p
不会改变按下
var
id单独输入时的值。使用
set“var=“
首先清除
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键,如果用户在可编程时间内没有响应,您还可以指定要选择的默认值。

此批处理文件使用命令选择(如果可用)(Windows Vista和更新的Windows版本、Windows Server 2003和更新的Windows Server版本)或使用选项
/P
命令设置,以提示用户十二个月中的一个月

@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在可用时是首选的,因为它是为选项菜单设计的。用户不能输入批处理脚本作者不需要的内容,因此通过使用分配给变量
errorlevel
CHOICE.exe
的退出代码,用户选择的评估很简单

根据Windows XP和以前的Windows版本的要求,使用带有选项
/p
的命令SET,问题更大,因为用户可以自由输入任何字符串,从空字符串到可能导致在批处理脚本编写器上执行恶意代码的字符串,但这并不能防止。还有很多其他原因安全地确保用户确实输入了范围
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/?
  • 获取/?
  • goto/?
  • 如果/?
  • rem/?
  • 设置/?
  • setlocal/?

此批处理文件使用命令选项(如果可用)(Windows Vista和更新的Windows版本,Windows Server 2003和更新的Windows Server版本)或命令设置(带有选项
/p
)来提示用户十二个月中的一个月

@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在可用时是首选的,因为它是为选项菜单设计的。用户不能输入批处理脚本作者不需要的内容,因此通过使用分配给变量
errorlevel
CHOICE.exe
的退出代码,用户选择的评估很简单

根据Windows XP和以前的Windows版本的要求,使用带有选项
/p
的命令SET,问题更大,因为用户可以自由输入任何字符串,从空字符串到可能导致在批处理脚本编写器上执行恶意代码的字符串,但这并不能防止。还有很多其他原因安全地确保用户确实输入了范围
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/?
  • 获取/?
  • goto/?
  • 如果/?
  • rem/?
  • 设置/?
  • setlocal/?

  • 获取输入的最基本方法是:

    set /P var123="Enter some value: "
    
    然后,您可以像这样使用变量
    var123

    echo %var123%
    

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

    set /P var123="Enter some value: "
    
    那么,你