电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

bat过滤任意字符


发布日期:2022/11/14
 
文章作者allyesno

早在写bat的一个小游戏猜数字的时候我就研究过这个问题如何在bat里面实现对输入的任意字符进行过滤当时使用的几种方法如下

Codz:

if%==要过滤的字符echo你输入的是非法字符

例:if%==wrongpasswordecho错误口令

seterrorlevel=

echo要过滤的字符|find要过滤的字符

if%errorlevel%==echo你输入的是是非法字符

if%errorlevel%==echo该字符串不在非法列表中

主要是使用这两种方法这两种方法可以过滤数字和英文字母但是对特殊字符不起作用

当要过滤【_+|=\[]{};:/>~`!@#$%^&*()_+|=\[]{};:/<>?】(包含空格和tab键值)的时候我们要这样

Codz:

echoanyword|findanywrod

注意到有什么不同了吗是的我们加入了来包含anyword可是过滤到此并没完成发现上面要过滤的字符少了什么吗是的少了字符本身遗憾的是这种方法无法完美的过滤字符本身当取值为奇数和偶数的时候用find对她进行过滤随条件不同可能会报错

这个问题困扰了我半年之久曾在安焦上问了一下没人回答

事实上要过滤它并不是那么的简单我们先写几个验证密码的小程序看看在不同情况下程序的反应

我们先写一个验证密码登录的小程序

当密码验证字符为phntm的时候授权登录

Codz:

@echooff

cls

:allyesno

seterrorlevel=>nul

echo请输入登录口令

set/ppassword=

echo%password%|findstrphntm

if%errorlevel%==echo口令正确&gotoend

echo口令错误&gotoallyesno

:end

echo你成功登录系统

将bat保存为keybat执行

执行结果

Codz:

C:test>key

请输入登录口令

test

口令错误

请输入登录口令

phntm

phntm

口令正确

你成功登录系统

事实上上面的代码用来进行一般的口令验证已经足够了但是要达到我们的目的任意字符过滤还不行

我们换个方式执行看看

执行结果

Codz:

C:test>key

请输入登录口令

test

口令错误

请输入登录口令

|findstrphntm

口令错误

请输入登录口令

phntm

phntm

口令正确

你成功登录系统

看见了吗当我们输入字符的时候程序报错了并显示了密码为什么会这样呢?我们再看这个语句的语法结构echo%password%|findstrphntm当%password%=的时候就是echo|findstrphntm

之所以会如此跟echo的特性有关我们看下面几个语句

Codz:

I:>echo|cd

|cd

I:>echo|cd

I:

I:>echo|cd

|cd

I:>echo|cd

I:

为奇数的时候则打印整行当为偶数的时候则执行|字符后面的命令上面程序执行的命令是cd

这里我想了一个办法绕过echo的报错特性我用set代替了echo程序如下

Codz:

@echooff

cls

:allyesno

seterrorlevel=>nul

echo请输入登录口令

set/ppassword=

set|findstrphntm

if%errorlevel%==echo口令正确&gotoend

echo口令错误&gotoallyesno

:end

echo你成功登录系统

执行结果如下

Codz:

请输入登录口令

test

口令错误

请输入登录口令

口令错误

请输入登录口令

phntm

password=phntm

口令正确

你成功登录系统

C:\test>

程序进一步的完美了

但是还是有问题D我们再来看换一种方式执行

Codz:

请输入登录口令

test

口令错误

请输入登录口令

phntmallyesno

password=phntmallyesno

口令正确

你成功登录系统

C:test>

由于程序的验证方式是set|findstrphntm所以只要包含phntm字符的密码都被当成正确密码所以密码phntmallyesno也通过了

为了避免这个问题我设置了匹配参数\<\>对数据进行检验修改后的程序如下

Codz:

@echooff

cls

:allyesno

seterrorlevel=>nul

echo请输入登录口令

set/ppassword=

set|findstr\<phntm\>

if%errorlevel%==echo口令正确&gotoend

echo口令错误&gotoallyesno

:end

echo你成功登录系统

执行结果

Codz:

请输入登录口令

test

口令错误

请输入登录口令

phntmallyesno

口令错误

请输入登录口令

phntm

password=phntm

口令正确

你成功登录系统

C:test>

最后再将程序修整如下

Codz:

@echooff

cls

:allyesno

seterrorlevel=>nul

echo请输入登录口令

set/ppassword=

rem如果密码字符串包含此行任一字符_+|=[]{};:/>~`!@#$%^&*()_+|=[]{};:/<>?则必须使用匹配模式<>

rem需要双写的字符

rem不可以作为密码的字符

setpassword|findstr\<phntm\>

if%errorlevel%==echo口令正确&gotoend

echo口令错误&gotoallyesno

:end

setpassword=>nul

echo你成功登录系统

当密码字符串中有字符\的时候需要将字符双写\\

例setpassword|findstr\<\\\>

登录的时候只需要写一次\不需要双写

字符不可以作为密码字符串如果密码字符串包含此行任一字符_+|=[]{};:/>~`!@#$%^&*()_+|=[]{};:/<>?则必须使用匹配模式\<\>

上一篇:DOS未公开命令与参数列表

下一篇:根据输入的文字实现输出倒文的批处理