利用批处理过滤任意字符
早在写 bat的一个小游戏猜数字的时候我就研讨过这个问题 怎样在bat里面实现 对输出的任意字符举行过滤 其时使用的几种要领如下
Codz:
if "%1"=="要过滤的字符" echo 你输出的黑白法字符
例: if "%1"=="wrongpassword" echo 错误口令
set errorlevel=0
echo 要过滤的字符|find "要过滤的字符"
if "%errorlevel%"=="0" echo 你输出的是黑白法字符
if "%errorlevel%"=="1" echo 该字符串不在合法列表中
主要是使用这两种要领 这两种要领可以过滤数字 和 英笔墨母 但是 对 特殊字符 不起作用
当要过滤【_+|-=\[]{};':,./">~`!@#$%^&*()_+|-=\[]{};':,./<>? 】(包含空格和tab键值)的时候 我们要这样
Codz:
echo "anyword"|find "anywrod"
细致到有什么不同了吗 是的 我们参加了""来包含anyword 但是过滤到此并没完成 发现下面要过滤的字符 少了什么吗 是的 少了" 字符自己 遗憾的是 这种要领 无法完美的过滤"字符自己 当" 取值 为奇数 和 偶数的 时候 用find对她举行 过滤 随条件 不同大概会报错
这个问题 困扰了 我半年之久 曾在安焦上 问了一下 没人答复
究竟上要过滤它 并不是那么的简略 我们先写几个验证暗码的小步伐 看看在不同环境下步伐的反响
我们先写一个验证暗码登录的小步伐
注:当暗码验证字符为ph4nt0m的时候 受权登录
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 请输出登录口令
set/p password=
echo "%password%"|findstr "ph4nt0m"
if "%errorlevel%"=="0" echo 口令精确&goto end
echo 口令错误&goto allyesno
:end
echo 你乐成登录体系
将bat生存为key.bat执行
执行效果
Codz:
C:test>key
请输出登录口令
test
口令错误
请输出登录口令
ph4nt0m
"ph4nt0m"
口令精确
你乐成登录体系
究竟 上 下面的代码用来举行一般的口令验证曾经足够了 但是 要到达我们的目的 任意字符过滤还不行
我们换个方式执行看看
执行效果
Codz:
C:test>key
请输出登录口令
test
口令错误
请输出登录口令
"
"""|findstr "ph4nt0m"
口令错误
请输出登录口令
ph4nt0m
"ph4nt0m"
口令精确
你乐成登录体系
看见了吗 当我们输出" 字符的时候 步伐报错了 并显示了暗码 为什么会这样呢? 我们再看这个语句的语法布局 echo "%password%"|findstr "ph4nt0m" 当%password%="的时候 便是echo """|findstr "ph4nt0m"
之所以会如此 跟echo的特性有关 我们看下面几个语句
Codz:
I:>echo "|cd
"|cd
I:>echo ""|cd
I:
I:>echo """|cd
"""|cd
I:>echo """"|cd
I:
当"为奇数的时候 则打印整行 当"为偶数的时候则 执行 | 字符背面的下令 下面步伐执行的下令是cd
这里我想了一个办法绕过echo的报错特性 我用set代替了echo 步伐如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 请输出登录口令
set/p password=
set |findstr "ph4nt0m"
if "%errorlevel%"=="0" echo 口令精确&goto end
echo 口令错误&goto allyesno
:end
echo 你乐成登录体系
执行效果如下
Codz:
请输出登录口令
test
口令错误
请输出登录口令
"
口令错误
请输出登录口令
ph4nt0m
password=ph4nt0m
口令精确
你乐成登录体系
C:\test>
步伐进一步的完美了
但是照旧有问题D 我们再来看 换一种方式执行
Codz:
请输出登录口令
test
口令错误
请输出登录口令
ph4nt0mallyesno
password=ph4nt0mallyesno
口令精确
你乐成登录体系
C:test>
由于步伐的验证方式是 set |findstr "ph4nt0m" 所以只需包含ph4nt0m字符的 暗码 都被当成精确暗码 所以暗码ph4nt0mallyesno 也经过了
为了避免这个问题 我设置了 立室参数\<\> 对数据举行检验 修改后的步伐 如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 请输出登录口令
set/p password=
set |findstr "\"
if "%errorlevel%"=="0" echo 口令精确&goto end
echo 口令错误&goto allyesno
:end
echo 你乐成登录体系
执行效果
Codz:
请输出登录口令
test
口令错误
请输出登录口令
ph4nt0mallyesno
口令错误
请输出登录口令
ph4nt0m
password=ph4nt0m
口令精确
你乐成登录体系
C:test>
最后再将步伐 修整 如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 请输出登录口令
set/p password=
rem 如果暗码字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>? 则必需使用立室模式<>
rem 必要双写的字符
rem 不行以作为暗码的字符 "
set password|findstr "\"
if "%errorlevel%"=="0" echo 口令精确&goto end
echo 口令错误&goto allyesno
:end
set password=>nul
echo 你乐成登录体系
注:当暗码字符串中有字符\的时候 必要将字符双写\\
例 set password|findstr "\<\\\>"
登录的时候 只必要写一次\不必要双写
" 字符 不行以作为暗码字符串 如果暗码字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>? 则必需使用立室模式\<\>
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|