中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何过滤变量中指定的字符[已解决]
« [1] [2] [3] »
作者:
标题: 如何过滤变量中指定的字符[已解决] 上一主题 | 下一主题
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 16 楼』:  

楼上的这些很实用,收下

2006-9-6 03:04
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 17 楼』:  

经过我实验用set name=| 是不可以的
但是用set /p name=input: 输入后是可以的 ,如图:
然后就可以用if语句一个一个字符判断了,这个的确可以做到我也实验成功了,可以过滤很多敏感字符,再结合findstr的限制就可以达到目的:规定输入为6~12个大写字母,小写字母,数字和符号_,其他符号过滤.要保证每一位都是前面的那些字符.
看我代码:

@setlocal
@set /p user=Input:
::过滤空字符以及不够六个字符的输入
@if "%user%"=="" goto error
@if "%user:~5,1%"=="" goto error
::过滤“|”号
@if "%user:~0,1%"=="|" goto error
@if "%user:~1,1%"=="|" goto error
@if "%user:~2,1%"=="|" goto error
@if "%user:~3,1%"=="|" goto error
@if "%user:~4,1%"=="|" goto error
@if "%user:~5,1%"=="|" goto error
@if "%user:~6,1%"=="|" goto error
@if "%user:~7,1%"=="|" goto error
@if "%user:~8,1%"=="|" goto error
@if "%user:~9,1%"=="|" goto error
@if "%user:~10,1%"=="|" goto error
@if "%user:~11,1%"=="|" goto error
::过滤其他敏感符号同上
::强制有效位为最多12位
@set user=%user:~0,12%
::限制输入字符为大写字母小写字符数字和_号
@echo %user% |findstr "[A-Za-z0-9_]"
@if errorlevel 1 goto error
@goto next
endlocal
:next
@echo succeed!
@goto end
:error
@echo Input error!
:end

但是有个符号 " 引号小弟不知道该怎么 办,怎么也过滤不掉郁闷,而且在输入中文的时候会提示过滤了,但是中文后面如果有英文字母的话就会成功通过过滤

这两点还请教各位大虾!

附件 1: 未命名.GIF (2006-9-9 04:44, 12.91 K, 下载附件所需积分 1 点 ,下载次数: 4)


2006-9-9 04:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 18 楼』:  

...... 没有人回复吗?
没有人会吗
斑竹给个答案啊

2006-9-9 23:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 19 楼』:  

难道真的没有人会吗?!

2006-9-10 01:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 20 楼』:  



  Quote:
Originally posted by fornever at 2006-9-9 04:45:
经过我实验用set name=| 是不可以的
但是用set /p name=input: 输入后是可以的 ,如图:
然后就可以用if语句一个一个字符判断了,这个的确可以做到我也实验戠...

  虽然在CMD命令行下输入是可以的,但是用在批处理中还是会出错。困惑中。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-10 23:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 21 楼』:  

Well,在批处理中赋值|到变量并非不可实现:
@echo off
    set "str=^|"
    echo %str%
pause
关于过滤字符,信手写出下面的代码, 希望能对需要的朋友有所帮助:
@echo off

:start
setlocal
    cls
    set /p var=请输入字符:
    call :filter "%var%"
endlocal
goto start

:filter
setlocal
    set "str=%~1★"
    set "str=%str:|=%"
    set "str=%str:&=%"
    set "str=%str:"=%"
    echo 过滤以后的字符为: %str:~0,-1%
    pause
endlocal
goto :eof
似乎可以过滤掉|,||,&,&&,",大家自行测试更改。

2006-9-10 23:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 22 楼』:  

  3742668版主的代码用call来调用就可以过滤掉了,一时还真想不到

  第一种情况如果不加转义字符的话,在批处理中无法通过,但是却可以在CMD命令行下成功运行,我对这点还是挺纳闷的。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-11 00:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 23 楼』:  



  Quote:
Originally posted by namejm at 2006-9-10 23:03:

  虽然在CMD命令行下输入是可以的,但是用在批处理中还是会出错。困惑中。

批处理中如果在 set /p user=input:下面跟上if 语句判断的话是通过的,如果没有IF的话也是不通过的,....想不通

而 set "str=|" 我在命令行下和批处理中都是通过的,难道和补丁有关>?

这个是我的补丁信息:

安装了 111 个修补程序。
[01]: File 1
[02]: File 1
[03]: File 1
[04]: File 1
[05]: File 1
[06]: File 1
[07]: File 1
[08]: File 1
[09]: File 1
[10]: File 1
[11]: File 1
[12]: File 1
[13]: File 1
[14]: File 1
[15]: File 1
[16]: File 1
[17]: File 1
[18]: File 1
[19]: File 1
[20]: File 1
[21]: File 1
[22]: File 1
[23]: File 1
[24]: File 1
[25]: File 1
[26]: File 1
[27]: File 1
[28]: File 1
[29]: File 1
[30]: File 1
[31]: File 1
[32]: File 1
[33]: File 1
[34]: File 1
[35]: File 1
[36]: File 1
[37]: File 1
[38]: File 1
[39]: File 1
[40]: File 1
[41]: File 1
[42]: File 1
[43]: File 1
[44]: File 1
[45]: File 1
[46]: File 1
[47]: File 1
[48]: File 1
[49]: File 1
[50]: File 1
[51]: File 1
[52]: File 1
[53]: File 1
[54]: File 1
[55]: Q147222
[56]: S867460 - Update
[57]: KB917734_WMP9
[58]: KB834707 - Update
[59]: KB873339 - Update
[60]: KB885835 - Update
[61]: KB885836 - Update
[62]: KB886185 - Update
[63]: KB886677 - Update
[64]: KB887472 - Update
[65]: KB888302 - Update
[66]: KB890046 - Update
[67]: KB890859 - Update
[68]: KB891781 - Update
[69]: KB893756 - Update
[70]: KB893803v2 - Updat
[71]: KB894391 - Update
[72]: KB896358 - Update
[73]: KB896423 - Update
[74]: KB896424 - Update
[75]: KB896428 - Update
[76]: KB898461 - Update
[77]: KB899587 - Update
[78]: KB899589 - Update
[79]: KB899591 - Update
[80]: KB900485 - Update
[81]: KB900725 - Update
[82]: KB901017 - Update
[83]: KB901190 - Update
[84]: KB901214 - Update
[85]: KB904706 - Update
[86]: KB905414 - Update
[87]: KB905749 - Update
[88]: KB908519 - Update
[89]: KB908531 - Update
[90]: KB910437 - Update
[91]: KB911280 - Update
[92]: KB911562 - Update
[93]: KB911567 - Update
[94]: KB911927 - Update
[95]: KB912919 - Update
[96]: KB913580 - Update
[97]: KB914388 - Update
[98]: KB914389 - Update
[99]: KB916595 - Update
[100]: KB917159 - Update
[101]: KB917344 - Update
[102]: KB917422 - Update
[103]: KB917953 - Update
[104]: KB918439 - Update
[105]: KB918899 - Update
[106]: KB920214 - Update
[107]: KB920670 - Update
[108]: KB920683 - Update
[109]: KB921398 - Update
[110]: KB921883 - Update
[111]: KB922616 - Update

[ Last edited by fornever on 2006-9-11 at 09:28 ]

2006-9-11 09:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 24 楼』:  

RE 3742668:
小弟新手,你代码中很多不很理解
call :filter "%var%"
call到了 filter标签并用 var变量作为参数,可 在filter标签下并未有用到var变量啊?
set "str=%~1★"
还有上面一句的意思

谢谢!

2006-9-11 09:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 25 楼』:  

我还有一个发现
就斑竹的代码我实验后,发现在输入字符时如果在把"&写在前面 ,那"&后面的所有字符都会忽略......能解释一下吗?

2006-9-11 09:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
9527
银牌会员

努力做坏人


积分 1185
发帖 438
注册 2006-8-28
来自 北京
状态 离线
『第 26 楼』:  

@echo off

:start
setlocal
    cls
    set /p var=请输入字符:
    call :filter "%var%"
endlocal
goto start

:filter
setlocal
    set "str=%~1★"
    set "str=%str:|=%"
    set "str=%str:&=%"
    set "str=%str:"=%"
    echo 过滤以后的字符为: %str:~0,-1%
    pause
endlocal
goto :eof



我来废话几句,call :filter "%var%" 这句是CALL调用过程执行相应代码,“%var%“ 是作为 %1 参数传递给执行代码的,版主主要是过滤掉了 | & “ 这三个字符,之所以用%str:~0,-1%来显示是因为开始的一句set "str=%~1★",把最后的那个五角星去掉而已.........



我今后在论坛的目标就是做个超级坏人!!!
2006-9-11 20:57
查看资料  发短消息 网志  OICQ (329429)  编辑帖子  回复  引用回复
zyyuser
新手上路





积分 2
发帖 1
注册 2006-1-12
状态 离线
『第 27 楼』:  

%Var:a=b%
把环境变量Var里的所有a替换为b

2006-9-12 23:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 28 楼』:  

  今天楼主告诉我说,如果"和&连在一起的话,会把&及其之后的字符全部过滤掉,看来3742668版主的代码还有考虑不周的地方,特修改如下,可以避免这个问题:

  Quote:
@echo off

:start
setlocal
    cls
    set /p var=请输入字符:
    set "var=%var:"=%"
    call :filter "%var%"
endlocal
goto start

:filter
setlocal
    set "str=%~1★"
    set "str=%str:|=%"
    set "str=%str:&=%"
    set "str=%str:"=%"
    echo 过滤以后的字符为: %str:~0,-1%
    pause
endlocal
goto :eof

[ Last edited by namejm on 2006-9-13 at 10:11 ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-13 10:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fornever
初级用户





积分 98
发帖 35
注册 2006-1-14
状态 离线
『第 29 楼』:  

先要谢谢NAMEJM兄的无私帮助!
现在回想自己有些愚笨了,虽然最后和自己的最初设想有些出入,不过总算有解决办法了.
对于我的方法,其实主要是引号的问题,其他字符都可以顺利检查到.如果还按照我的初衷的话只需要在前面加一句set "var=%var:"=%"就可以搞定引号了.不过是做不到提示了,而是直接通过不过对字符做了处理(过滤了引号).这样的话只要用echo 说明出来就可以了.回头看自己的代码写出来后会是多么的臃肿,汗!

那结论就是了,如果你想要凝练的代码,那只用set "var=%var:"=%"过滤掉敏感字符,(主要是findstr语句敏感)然后用findstr "[A-Za-z0-9_]"加if errorlevel就可以直接限制了,不用去想剩下字符的情况了(有N多的符号,制表符什么的).
如果你想要出现错误有提示的话就用set /p var=input:后面家if "%var%"=="|" goto error 的语句跳转就好了.

就这些了吧,我想不起来了.还有什么情况大家一起来讨论哈!
解铃还需系铃人,哈哈!

2006-9-15 10:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yangxixing
初级用户




积分 25
发帖 16
注册 2006-10-12
状态 离线
『第 30 楼』:  

收下学习了

2007-11-22 23:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: