Board logo

标题: [出题]批处理限制输入只能为字母且个数在3-10之间 [打印本页]

作者: 随风    时间: 2009-3-27 21:19     标题: [出题]批处理限制输入只能为字母且个数在3-10之间

在别的论坛看到这个题目,大家没事练练手吧,看都有些什么方法实现。
要求:对用户的输入进行判断,字符数不能少于3个,大于10个,且必须是字母(不分大小写)
作者: tireless    时间: 2009-3-27 22:07

  1. @echo off
  2. :repeat
  3. set /p input=请输入:
  4. if "%input:~2,1%" equ "" goto repeat
  5. if "%input:~10,1%" neq "" goto repeat
  6. for /f "delims=abcdefghijklmnopqrstuvwxyz" %%a in ("%input%") do (
  7.   if "%%a" neq "" goto repeat
  8. )
  9. pause
复制代码

作者: 随风    时间: 2009-3-27 22:15     标题: 回复 2楼 的帖子

未对大小写作判断。。
作者: zhouyongjun    时间: 2009-3-27 22:39

  1. @echo off
  2. :repeat
  3. set/p input=请输入:
  4. if "%input:~2,1%" equ "" goto repeat
  5. if "%input:~10,1%" neq "" goto repeat
  6. echo.%input%|findstr/i "^[a-z]*$">nul2>nul||goto repeat
  7. pause
复制代码

[ 本帖最后由 zhouyongjun 于 2009-3-27 23:08 编辑 ]
作者: 随风    时间: 2009-3-27 22:46     标题: 回复 4楼 的帖子

>nul2>nul  两句中间应该要个空格吧。
作者: Batcher    时间: 2009-3-27 22:50

  1. @echo off
  2. rem 限制输入3位至10位字母
  3. set LenMin=3
  4. set LenMax=10
  5. set AllLetter=a b c d e f g h i j k l m n o p q r s t u v w x y z
  6. :GetInput
  7. set input=
  8. set /p "input=请输入3至10位字母:"
  9. if "%input%" neq "" (
  10.   if "%input:~2,1%" equ "" (
  11.     echo 不足%LenMin%位
  12.     goto :GetInput
  13.   ) else if "%input:~10,1%" neq "" (
  14.     echo 多于%LenMax%位
  15.     goto :GetInput
  16.   )
  17. ) else (
  18.   echo 输入不能为空
  19.   goto :GetInput
  20. )
  21. setlocal enabledelayedexpansion
  22. for %%a in (%AllLetter%) do (
  23.   set input=!input:%%a=!
  24.   if "!input!" equ "" (
  25.     goto :RightInput
  26.   )
  27. )
  28. if "!input!" neq "" (
  29.   echo 只能输入纯字母[a-zA-Z]
  30.   endlocal
  31.   goto :GetInput
  32. )
  33. :RightInput
  34. echo 恭喜输入正确
  35. pause
复制代码

[ 本帖最后由 Batcher 于 2009-3-29 14:20 编辑 ]
作者: tireless    时间: 2009-3-27 22:50

  1. @echo off&setlocal enabledelayedexpansion
  2. :repeat
  3. set /p input=请输入:
  4. echo !input!>%temp%\#tmp#
  5. findstr /xi "[a-z][a-z][a-z] [a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" %temp%\#tmp# >nul || goto repeat
  6. pause
复制代码
或者:
  1. @echo off
  2. :repeat
  3. set /p input=请输入:
  4. (call set/p="%%input%%"<nul&echo.)>%temp%\#tmp#
  5. findstr /xi "[a-z][a-z][a-z] [a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" %temp%\#tmp# >nul || goto repeat
  6. pause
复制代码

[ 本帖最后由 tireless 于 2009-3-27 23:47 编辑 ]
作者: 随风    时间: 2009-3-27 22:55     标题: 回复 7楼 的帖子

I 服了 you !
思路倒是不错,只是代码。。。。。
作者: Batcher    时间: 2009-3-27 23:01     标题: 回复 4楼 的帖子

输入off
代码出现误判
^_^
作者: 随风    时间: 2009-3-27 23:03

batcher 真是细心  echo.%input% 就可以解决了
作者: zhouyongjun    时间: 2009-3-27 23:08     标题: 回复 9楼 的帖子

哈哈,batcher思维果然严谨
作者: tireless    时间: 2009-3-27 23:13

7楼代码已修改。

代码难看不代表效率低啊

[ 本帖最后由 tireless 于 2009-3-27 23:34 编辑 ]
作者: Batcher    时间: 2009-3-27 23:15     标题: 回复 12楼 的帖子

7楼是不是再改改?否则遇到off一样会误判^_^
作者: 随风    时间: 2009-3-27 23:17     标题: 回复 12楼 的帖子

处理 off 的办法以在10楼解决,不行么?
代码除了要讲究效率以外,还要在可能的情况下讲究简洁和美观。
作者: Batcher    时间: 2009-3-27 23:19     标题: 回复 14楼 的帖子

可以啊,我只是建议tireless兄更新一下7楼的代码 :)
作者: 随风    时间: 2009-3-27 23:21     标题: 回复 15楼 batcher 的帖子

汗!我14楼的回复是对12楼的,不是说你啊。。
作者: tireless    时间: 2009-3-27 23:41

好像要用 findstr 处理特殊字符,只有用 7 楼的方法(生成临时文件)
作者: 随风    时间: 2009-3-27 23:48     标题: 回复 17楼 的帖子

为什么不认真看看回帖呢?
作者: tireless    时间: 2009-3-27 23:52     标题: 回复 18楼 的帖子

看了。试了会出错。要不你把完整代码写下,我不信不会出错...
作者: 随风    时间: 2009-3-27 23:53     标题: 回复 19楼 的帖子

你所说的“特殊字符”是指什么? off 吗?
作者: Batcher    时间: 2009-3-27 23:55     标题: 回复 20楼 的帖子

他说的可能是用户输入的重定向符号、双引号等特殊字符吧
作者: tireless    时间: 2009-3-27 23:55     标题: 回复 20楼 的帖子

除了 off 还包括 ^ > & "
作者: rat    时间: 2009-3-27 23:56

  1. @set /p s=Plz input:
  2. @mshta javascript:alert(/^^[a-z]{3,10}$/i.test("%s%"));close()
复制代码

作者: 随风    时间: 2009-3-27 23:57

特殊字符 是cmd 永远的痛,所以在不是明确要处理的情况下,一般是默认没有特殊字符的,
处理 off 的方法,10楼以有明确代码。
作者: batman    时间: 2009-3-28 00:03

没考虑特殊字符:
  1. @echo off
  2. set /p input=请输入:
  3. echo.%input%>1.temp
  4. for /r %%a in (*.temp) do set /a a=%%~za-2
  5. if %a% lss 3 echo 输入字符少于3个&goto :end
  6. if %a% gtr 10 echo 输入字符多于10个&goto :end
  7. echo.%input%|findstr "[^a-z]">nul&&echo 输入字符中有非字母字符&&goto end
  8. echo 输入字符符合要求
  9. :end
  10. del /q 1.temp&pause>nul
复制代码

[ 本帖最后由 batman 于 2009-3-28 00:10 编辑 ]
作者: 随风    时间: 2009-3-28 00:06

通过文件大小来判断字符数,果然比较新颖。echo %input% 为什么不写成echo.%input%呢?
作者: batman    时间: 2009-3-28 00:10

所言即是,已修改
作者: tireless    时间: 2009-3-28 00:17     标题: 回复 25楼 的帖子

for /r %%a in (*.temp) do set /a a=%%~za-2

可以换成:

for %%a in (1.temp) do set /a a=%%~za-2

-----------

findstr "[^a-z]" 没忽略大小写......不过都是鸡毛蒜皮的事......
作者: Batcher    时间: 2009-3-28 00:17     标题: 回复 25楼 的帖子

for /r 的用意何在?
与直接for相比,其优势在哪里?

汗水,28楼和29楼都是2009-3-28 00:17,我跑到tireless兄后面去了,呵呵。
作者: Batcher    时间: 2009-3-28 00:22     标题: 回复 28楼 的帖子

这里是不需要使用/i来忽略大小写的,正则表达式足矣。
作者: zqz0012005    时间: 2009-3-28 08:49     标题: 回复 17楼 的帖子

如果要使用管道,的确要用到临时文件才行。
http://www.bathome.net/viewthread.php?tid=3830&page=1#pid24372
开始我老想着用findstr判断字符,发现必须要用到临时文件。

[ 本帖最后由 zqz0012005 于 2009-3-28 14:29 编辑 ]
作者: 随风    时间: 2009-3-28 19:54

原帖由 zqz0012005 于 2009-3-28 08:49 发表
如果要使用管道,的确要用到临时文件才行。
http://www.bathome.net/viewthread.php?tid=3830&page=1#pid24372
开始我老想着用findstr判断字符,发现必须要用到临时文件。


其实所有的判断都可以用findstr来完成,并不需要临时文件。
兼容大部分特殊符号。

  1. @echo off&set "f=findstr .....|findstr /v ............."
  2. :loop
  3. echo.&set a=a&set var=&set /p var= 请输入3至10位英文字母 &cls
  4. echo."%var%"|%f%|findstr "^\"[a-zA-Z]*\"$">nul&&set "a="
  5. if defined a (echo  输入错误) else echo  %var% 正确
  6. goto loop
复制代码

[ 本帖最后由 随风 于 2009-3-28 21:02 编辑 ]
作者: Batcher    时间: 2009-3-28 20:28     标题: 回复 32楼 的帖子

31楼说的临时文件估计是想兼容所有特殊符号
作者: tireless    时间: 2009-3-28 20:54     标题: 回复 32楼 的帖子

输入 Zip,提示“输入错误”
输入 ",显示 """|findstr .....|findstr /v .............|findstr "\"[a-z]*\"$">nul&&set "a="
输入 "&",批处理退出。
作者: 随风    时间: 2009-3-28 21:06     标题: 回复 34楼 的帖子

已经说明可兼容大部分特殊符号,而不是所有特殊符号,其中引号就是没法处理的
输入 Zip 提示错误,已经改正,由此引发另一个问题,大家可以探讨一下
为什么第一个字母为大写Z时,findstr 就必须指定忽略大小写呢?
echo Zip|findstr "^[a-z]*$" 错误
echo Yip|findstr "^[a-z]*$" 正确
echo Zip|findstr /i "^[a-z]*$" 正确
作者: zjw767676    时间: 2009-3-29 13:06

原帖由 Batcher 于 2009-3-27 22:50 发表
if "!input!" neq "" (
  echo 只能输入纯字母[a-zA-Z]
  goto :GetInput
)
endlocal

这里的endlocal好像执行不到,有必要加吗?
作者: 随风    时间: 2009-3-29 13:13     标题: 回复 36楼 的帖子

执行的到,不信你连续33次输入错误看看。
作者: zjw767676    时间: 2009-3-29 13:49     标题: 回复 37楼 的帖子

原来是这样
  1. 请输入3至10位字母:134
  2. 已经达到最大的 setlocal 递归层
  3. 只能输入纯字母[a-zA-Z]
  4. 请输入3至10位字母:
复制代码
去掉endlocal后:
  1. 请输入3至10位字母:134
  2. 已经达到最大的 setlocal 递归层。
  3. 只能输入纯字母[a-zA-Z]
  4. 请输入3至10位字母:135
  5. 已经达到最大的 setlocal 递归层。
  6. 只能输入纯字母[a-zA-Z]
  7. 请输入3至10位字母:136
  8. 已经达到最大的 setlocal 递归层。
  9. 只能输入纯字母[a-zA-Z]
  10. 请输入3至10位字母:
复制代码
感谢随风,受教了!
作者: zjw767676    时间: 2009-3-29 14:01     标题: 回复 32楼 的帖子

set "f=findstr .....|findstr /v ............."
请教这个命令怎么解释?
set f=是把命令赋予f,里面的.........是什么意思?
作者: rat    时间: 2009-3-29 14:08     标题: 回复 37、38楼 的帖子

确实执行不到endlocal
作者: Batcher    时间: 2009-3-29 14:13     标题: 回复 39楼 的帖子

点,在正则表达式中是通配符,表示任意一位字符。
.. 表示任意2位字符
... 表示任意3位字符
.... 表示任意4位字符
以此类推
作者: 随风    时间: 2009-3-29 14:18     标题: 回复 40楼 的帖子

确实应该是执行不到,batcher 是否应该考虑改一下endlocal的位置。
作者: Batcher    时间: 2009-3-29 14:20     标题: 回复 42楼 的帖子

Done.
改好了。
作者: everest79    时间: 2009-3-30 01:43

32l学习了,思路很别致
作者: cainiao736    时间: 2009-4-6 17:18

  1. @echo off
  2. set /p str=请输入3到10个字母:
  3. set var=%str%
  4. set n=0
  5. :begin
  6. set a=%str:~0,1%
  7. set /a n+=1
  8. set str=%str:~1%
  9. if not "%str%"=="" goto begin
  10. if %n% lss 3 echo 字符数不符&&goto eof
  11. if %n% gtr 10 echo 字符数不符&&goto eof
  12. echo %var%|findstr "[^a-z]">nul&&echo 输入的字符不完全是字母&&goto eof
  13. echo 输入正确!
  14. :eof
  15. pause
复制代码

[ 本帖最后由 cainiao736 于 2009-4-6 22:35 编辑 ]
作者: Batcher    时间: 2009-4-6 17:27     标题: 回复 45楼 的帖子

学学怎么调试代码吧:
不要双击运行
把代码保存为C:\test.bat
把@echo off删除
开始
运行
cmd
C:\test.bat
看看执行过程再好好想想
作者: cainiao736    时间: 2009-4-6 22:36

谢谢Batcher的提醒,45L代码已经修改
作者: zqz0012005    时间: 2009-4-14 11:02     标题: 回复 31楼 的帖子

竟然忘了,可以通过 set var 列举变量的方式来避免直接显示变量值,就可以绕过特殊字符问题。
set var|findstr /x "var=[a-Z]*"

感谢此帖提醒:http://www.bathome.net/thread-4159-1-1.html
作者: netbenton    时间: 2009-4-23 23:38

呵呵,原来区分字母如此简单!
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. set n=0
  4. :rep
  5. set/a n+=1
  6. set /p str=输入3-10个字母:
  7. for /l %%a in (0,1,10) do (
  8.         set one=!str:~%%a,1!
  9.         if not defined one if %%a geq 3 (goto :ok) else (echo 不足3个&goto :rep)
  10.         if !one! lss a echo 有非法字符&goto :rep
  11.         if !one! gtr z echo 有中文字符&goto :rep
  12. )
  13. echo 超过10个&goto :rep
  14. :ok
  15. echo 你输入了%n%次终于搞对一次了:!str!
  16. echo.
  17. echo 再来!
  18. goto :begin
复制代码

[ 本帖最后由 netbenton 于 2009-4-23 23:43 编辑 ]
作者: zljzsmzzx    时间: 2009-6-10 18:52     标题: 回复 49楼 的帖子

不能识别大写字母。我把这句“if !one! gtr z echo 有中文字符&goto :rep”改成大写字母“Z”:“if !one! gtr Z echo 有中文字符&goto :rep”。测试了一下好像可以。不知道有没有错。
作者: yi12133    时间: 2009-7-1 15:33

难倒不是很难,不过有几个代码不知道什么意思。
作者: keen    时间: 2009-7-1 16:54     标题: 回复 51楼 的帖子

有什么不懂,可以在相应版块发帖求助。
作者: canyuexiaolang    时间: 2009-8-14 19:48     标题: 回复 7楼 的帖子

那要求只能输入数字你还不得……晕死
作者: Seter    时间: 2009-8-21 09:03

原帖由 canyuexiaolang 于 2009-8-14 19:48 发表
那要求只能输入数字你还不得……晕死

弱弱的问,数字的话直接比较就可以了把?




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