找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27213|回复: 7

[已解决] 批处理输入变量的内容包含特殊字符时, 如何处理?

[复制链接]
发表于 2012-6-14 13:00:42 | 显示全部楼层 |阅读模式
本帖最后由 极品小猫 于 2012-6-18 07:57 编辑

代码如下, 例如输入的内容为 | * 等特殊字符时, 会直接出错, 有什么办法可以在不需要输入预处理符号的情况下, 对输入包含特殊字符的内容进行处理

要求: 在输入非0-9的字符时, 进行提示. 另外, 变量为空值时不会退出批处理

  1. @echo off
  2. :if
  3. set num=
  4. set /p "num=请输入: "
  5. ::遍历 num 寻找非 0-9 的字符, 并提示
  6. for /f "delims=" %%i in ('echo %num%^|findstr "[^0-9]"') do (
  7.         cls
  8.         if not "%%i"=="" echo 请输入纯数字!
  9.         goto :if
  10. )

  11. if /i %num% lss 10 (set num=0%num%) else (echo %num%)
  12. echo %num%
复制代码

评分

参与人数 1PB +2 收起 理由
zqz0012005 + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-6-14 13:05:00 | 显示全部楼层
“预处理”这个词好流行啊。。。
这件事情怎么预处理?
你的伤口怎么预处理?
城管打人怎么预处理?
发表于 2012-6-14 13:17:00 | 显示全部楼层
预处理是cmd内部自动进行的,你是无法改变的,除非你重写一个cmd。
你要做的是如何“处理”特殊字符,而不是如何“预处理”。

  1. set num|findstr /x "num=[0-9]*" >nul || (echo 请输入纯数字!&goto :if)
复制代码

评分

参与人数 1技术 +1 收起 理由
zqz0012005 + 1 乐于助人

查看全部评分

发表于 2012-6-14 13:21:40 | 显示全部楼层
本帖最后由 CrLf 于 2012-6-15 09:27 编辑

可在 for /f 内部使用变量延迟:
  1. for /f ... in ('cmd /v /c echo !num!^|findstr "[^0-9]') do ...
复制代码
可以用逻辑连接符简化成:
  1. cmd /v /c echo !num!|findstr "[^0-9]||echo 请输入纯数字!
复制代码
不过更好的办法是改进思路:
  1. for /f "eol=0 delims=0123456789" %%a in ("%num:"=""%") do echo 请输入纯数字!
  2. ::将数字设为分隔符,若能取到第一节,则存在非数字字符
复制代码
  1. set /a test=num
  2. if "%test%" neq "%num:"=""%" echo 请输入纯数字!
  3. ::数值运算,八进制数和十六进制数会被转为十进制,而非纯数字变量则会被赋为0,运算后比较前后变量,若不相同则可知不为纯数字
复制代码

评分

参与人数 1技术 +1 收起 理由
极品小猫 + 1 问题解决了, 版大v5

查看全部评分

发表于 2012-6-14 13:28:08 | 显示全部楼层
本帖最后由 CrLf 于 2012-6-14 14:05 编辑

另:
  1. if not "%%i"=="" echo 请输入纯数字!
复制代码
这句是多余的,当 tokens 所取的节(隐式声明为 tokens=1)不存在时,for是不会为当前行执行命令的,举个例子,下面这段代码:
  1. for /f "tokens=1,2" %%a in (a.txt) do (
  2.    echo %%a,%%b
  3. )
复制代码
实际效果等几乎等于:
  1. for /f "tokens=1,2" %%a in (a.txt) do (
  2.    if "%%a" neq "" (
  3.       if "%%b" neq "" (
  4.          echo %%a,%%b
  5.       )
  6.    )
  7. )
复制代码
这就是 for 一定会跳过空行的本质原因
发表于 2012-6-14 13:36:46 | 显示全部楼层
版主神人。。。
 楼主| 发表于 2012-6-14 14:13:34 | 显示全部楼层
本帖最后由 极品小猫 于 2012-6-14 19:20 编辑
可在 for /f 内部使用变量延迟:可以用逻辑连接符简化成:不过更好的办法是改进思路:
CrLf 发表于 2012-6-14 13:21


回复powerbat: 发帖的时候也感觉标题有点问题

Ctrlv5, 感谢Ctrl版大的指导, 很详细的解释, 发帖的时候忘记说了一个问题.

希望在变量的值为空的时候也不会退出批处理.
发表于 2012-6-14 15:58:16 | 显示全部楼层
版主V5
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:49 , Processed in 0.020144 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表