Batch file 批处理文件:用户输入操作
我有一个批次需要一些信息,所以我决定使用命令set/p“var=”,但我想先做一些操作或限制Batch file 批处理文件:用户输入操作,batch-file,Batch File,我有一个批次需要一些信息,所以我决定使用命令set/p“var=”,但我想先做一些操作或限制 如果我想询问日期set/p“date=insert date,如2012/07/15=“”,我只想在以这种方式输入2012/07/15时接受答案 2.如果我想询问优惠券编号set/p“number=insert number=“”,我想在代码的第一个字符是Z然后number=number忽略Z时进行询问,例如,如果用户插入z12345 我想要NUMBER=12345,所以我执行了命令的这一半如果“%va
set/p“date=insert date,如2012/07/15=“
”,我只想在以这种方式输入2012/07/15时接受答案set/p“number=insert number=“
”,我想在代码的第一个字符是Z然后number=number忽略Z时进行询问,例如,如果用户插入z12345
我想要NUMBER=12345,所以我执行了命令的这一半如果“%var:~0,1%”==“z”,那么???
所以我不知道怎么做剩下的
我还注意到,如果我想执行第四个字符,那么如果“%var:~4,1%”==“g”,这将不起作用,为什么?您可以使用
findstr/R
用正则表达式检查输入
差不多
setlocal EnableDelayedExpansion
set "myDate="
set /p myDate=
if defined myDate (
echo !myDate! | findstr /R "^[0123456789][0123456789][0123456789][0123456789]/[0123456789][0123456789]/[0123456789][0123456789]" >nul && Echo ok || echo fail
)
您可以使用
findstr/R
使用正则表达式检查输入
差不多
setlocal EnableDelayedExpansion
set "myDate="
set /p myDate=
if defined myDate (
echo !myDate! | findstr /R "^[0123456789][0123456789][0123456789][0123456789]/[0123456789][0123456789]/[0123456789][0123456789]" >nul && Echo ok || echo fail
)
以下脚本显示了如何执行这两项任务:
@setlocal enableextensions enabledelayedexpansion
@echo off
set /p "dt=Enter date as yyyy/mm/dd: "
set rc=1
echo x%dt%x| findstr /r "^x[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]x$" >nul: && set rc=0
if %rc%==1 (
echo Invalid date
goto :endl
)
echo Date was %dt%
set /p "num=Enter number as z99999 or 99999: "
if %num:~0,1%==xz set num=!num:~1!
echo Number was %num%
:endl
endlocal
第一部分介绍如何使用findstr
及其正则表达式功能来设置rc
返回代码变量,然后可以检查该变量
第二部分显示了如何从字符串中去掉第一个字符(如果它是z
),尽管您可能会发现findstr
在那里也很有用,因此您可以检查整个字符串,例如:
set /p "num=Enter number as z99999 or 99999: "
if %num:~0,1%==xz set num=!num:~1!
set rc=1
echo x%num%x| findstr /r "^x[0-9][0-9][0-9][0-9][0-9]x$" >nul: && set rc=0
if %rc%==1 (
echo Invalid number
goto :endl
)
echo Number was %num%
以下脚本显示了如何执行这两项任务:
@setlocal enableextensions enabledelayedexpansion
@echo off
set /p "dt=Enter date as yyyy/mm/dd: "
set rc=1
echo x%dt%x| findstr /r "^x[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]x$" >nul: && set rc=0
if %rc%==1 (
echo Invalid date
goto :endl
)
echo Date was %dt%
set /p "num=Enter number as z99999 or 99999: "
if %num:~0,1%==xz set num=!num:~1!
echo Number was %num%
:endl
endlocal
第一部分介绍如何使用findstr
及其正则表达式功能来设置rc
返回代码变量,然后可以检查该变量
第二部分显示了如何从字符串中去掉第一个字符(如果它是z
),尽管您可能会发现findstr
在那里也很有用,因此您可以检查整个字符串,例如:
set /p "num=Enter number as z99999 or 99999: "
if %num:~0,1%==xz set num=!num:~1!
set rc=1
echo x%num%x| findstr /r "^x[0-9][0-9][0-9][0-9][0-9]x$" >nul: && set rc=0
if %rc%==1 (
echo Invalid number
goto :endl
)
echo Number was %num%
此外,还介绍了编写自己的“SET/p”例程的方法,因此您可以根据自己的具体需要对其进行修改。请注意,这不是读取字符串后的测试,而是在读取字符串时处于活动状态的交互式测试。您甚至可以限制用户完成输入的时间
查找“3-GetKey.exe.hex”辅助程序,然后查找“Readline subroutine”
我希望有帮助
Antonio介绍了一种编写自己的“SET/p”例程的方法,因此您可以根据自己的具体需要对其进行修改。请注意,这不是读取字符串后的测试,而是在读取字符串时处于活动状态的交互式测试。您甚至可以限制用户完成输入的时间
查找“3-GetKey.exe.hex”辅助程序,然后查找“Readline subroutine”
我希望有帮助
Antonio您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取日期格式的行;用户键入字符时,斜杠将自动插入:
call :ReadFormattedLine myDate="####/##/##" /M "insert date like this 2012/07/15: "
下面的命令读取由5位数字组成的数字;子例程不接受非数字字符:
call :ReadFormattedLine NUMBER="#####" /M "insert number: "
此子例程是以纯批处理方式编写的,因此不需要任何附加程序,并且允许执行多个格式化输入操作,如读取密码。您可以从下载。您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取日期格式的行;用户键入字符时,斜杠将自动插入:
call :ReadFormattedLine myDate="####/##/##" /M "insert date like this 2012/07/15: "
下面的命令读取由5位数字组成的数字;子例程不接受非数字字符:
call :ReadFormattedLine NUMBER="#####" /M "insert number: "
此子例程是以纯批处理方式编写的,因此不需要任何附加程序,并且允许执行多个格式化输入操作,如读取密码。您可以从下载。答案很好,但是我的第二个问题呢?顺便问一下,如果我想插入字母,我应该做[abc..to infinity]吗?不区分大小写呢?据我所知,如果定义了日期,则
中的条件决不能为假,因为日期
在Windows中决不能未定义。@Andrey M-说得好!在这里使用date
asw变量名不好,我会更改it@Leo92-但是我的第二个问题呢?
嗯,我给你指出了正确的方向,现在你应该能够自己解决这个问题了。很好的答案,但是我的第二个问题呢?顺便问一下,如果我想插入字母,我应该做[abc..to infinity]吗?不区分大小写呢?据我所知,如果定义了日期,则中的条件决不能为假,因为日期
在Windows中决不能未定义。@Andrey M-说得好!在这里使用date
asw变量名不好,我会更改it@Leo92-但是我的第二个问题呢?
嗯,我告诉你正确的方向,现在你应该能够自己解决它注意,有一个系统环境变量叫做DATE
,除非被重写,计算为当前系统日期。在这种情况下,我应该如何使用它?您不一定需要使用它,因为我不确定脚本请求的日期。无论如何,系统的日期变量值除了用于显示当前日期外,对于其他用途很少有用。我可以详细解释一下原因,但我的观点是,如果您使用的名称已经被操作系统保留为其他名称,那么您可能会在使用此类变量时遇到一些“有趣”的行为。特别是,您不能真正取消定义这样一个变量,因为一旦您取消定义,系统就会用该变量要保存的值来定义它。好的,谢谢,非常有用的信息对不起,我想您已经在那里丢失了我。请注意,有一个名为D的系统环境变量