Board logo

标题: [文本处理] 【已解决】询问批处理如何判断用户输入的参数是否符合规定要求? [打印本页]

作者: ultrasurf    时间: 2009-3-20 07:48     标题: 【已解决】询问批处理如何判断用户输入的参数是否符合规定要求?

例如在下面这个代码中
需要用户输入IP地址
IP地址的格式是 xx.xx.xx.xx
xx在1到255之间的数,且IP地址共有四段(由 . 来分割)
请问如何判断用户的输入符合格式要求呢?
符合要求的话显示IP地址,不符合的话要求重新输入
谢谢~

@echo off
:input
set /p ip=请输入IP地址

:right
echo IP Address: %ip%
goto end

:wrong
goto inpunt

:end
pause

[ 本帖最后由 ultrasurf 于 2009-3-21 09:43 编辑 ]
作者: 随风    时间: 2009-3-20 13:00

  1. @echo off
  2. set "pp=[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$"
  3. set flag=&set /p ip= 请输入IP地址 &cls
  4. echo %ip%|findstr /x "%pp%">nul||set flag=a
  5. set var=%ip:.= %
  6. for %%a in (%var%) do if %%a gtr 255 set flag=a
  7. if defined flag (echo %ip% 错误) else echo %ip% 正确
  8. pause
复制代码

作者: ultrasurf    时间: 2009-3-20 22:27

谢谢版主
代码非常好用,不过请问版主能解释一下代码的含义吗....
好象看不大懂,,,

谢谢~
作者: Batcher    时间: 2009-3-20 22:29     标题: 回复 3楼 的帖子

哪句不懂,就问哪句,有很多热心人会告诉你答案;如果全部不懂,建议先去教学区学习基础教程,这样才能更快的掌握批处理。
作者: ultrasurf    时间: 2009-3-20 23:05


就是这句,看晕了
"pp=[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$"
对于Ip地址, findstr /x "pp=[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$"

/x是完全匹配,那么这里的pp到底是怎么匹配呢?

还有这句:
set var=%ip:.= %
ip:.= 是什么意思呢?

谢谢~
作者: Batcher    时间: 2009-3-20 23:35     标题: 回复 5楼 的帖子

问题1:本论坛搜索“findstr正则表达式”
问题2:查看set命令的帮助:
Environment variable substitution has been enhanced as follows:

    %PATH:str1=str2%

would expand the PATH environment variable, substituting each occurrence
of "str1" in the expanded result with "str2".  "str2" can be the empty
string to effectively delete all occurrences of "str1" from the expanded
output.  "str1" can begin with an asterisk, in which case it will match
everything from the beginning of the expanded output to the first
occurrence of the remaining portion of str1.

作者: ultrasurf    时间: 2009-3-21 00:07

学习了一下,明白了
版主有空的话看看我理解得对不对吧~谢谢~

@echo off

set "pp=[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$"
rem 第一位必须是1-9,然后后面如果有数字,必须是是0-9之间的数字
rem \是转义符,说明后面的特殊符号.是作为字符
rem comments: 对于我这种情况,应该也等价于 ^[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$ 吧.还有 set 后面的和结束的双引号""不是必须的吧?

set flag=&set /p ip= 请输入IP地址 &cls
rem 这里有三句命令 set flag = 一开始flag未被定义
rem set /p ip= 让用户输入IP
rem cls 清屏

echo %ip%|findstr /x "%pp%">nul||set flag=a
rem 对于用户输入的IP地址,完全根据一开始定义的pp进行匹配
rem 如果出错,则对flag进行标记*定义)

set var=%ip:.= %
rem 将ip地址中的.全部替换为空格
rem 是不是不用这步的话,也可以在下一句for里面用 /k delims=. 来处理的吧?

for %%a in (%var%) do if %%a gtr 255 set flag=a
rem 对于IP地址中任意一位>255(错误的情况),对flag做标记

if defined flag (echo %ip% 错误) else echo %ip% 正确
rem 如果flag未被定义过,则正确,否则,出错

pause
作者: Batcher    时间: 2009-3-21 00:16     标题: 回复 7楼 的帖子

//第一位必须是1-9,然后后面如果有数字,必须是是0-9之间的数字
有没有注意到$符号呢?

//set 后面的和结束的双引号""不是必须的吧?
是不是必须的,你可以亲自测试一下。不管怎样,大多数情况下,加双引号是个好习惯。

//是不是不用这步的话,也可以在下一句for里面用 /k delims=. 来处理的吧?
你可以亲自尝试一下是否可行。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2