熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> 嵌入式開發 >> 正文

bat過濾任意字符

2022-06-13   來源: 嵌入式開發 
文章作者allyesno

早在寫 bat的一個小游戲猜數字的時候我就研究過這個問題 如何在bat裡面實現 對輸入的任意字符進行過濾 當時使用的幾種方法如下
Codz: 
if %==要過濾的字符 echo 你輸入的是非法字符 
例: if %==wrongpassword echo 錯誤口令 

set errorlevel= 
echo 要過濾的字符|find 要過濾的字符 
if %errorlevel%== echo 你輸入的是是非法字符 
if %errorlevel%== echo 該字符串不在非法列表中



主要是使用這兩種方法 這兩種方法可以過濾數字 和 英文字母 但是 對 特殊字符 不起作用

當要過濾【_+|=\[]{};:/>~`!@#$%^&*()_+|=\[]{};:/<>? 】(包含空格和tab鍵值)的時候 我們要這樣

Codz: 
echo anyword|find anywrod

注意到有什麼不同了嗎 是的 我們加入了來包含anyword 可是過濾到此並沒完成 發現上面要過濾的字符 少了什麼嗎 是的 少了 字符本身 遺憾的是 這種方法 無法完美的過濾字符本身 當 取值 為奇數 和 偶數的 時候 用find對她進行 過濾 隨條件 不同可能會報錯

這個問題 困擾了 我半年之久 曾在安焦上 問了一下 沒人回答 

事實上要過濾它 並不是那麼的簡單 我們先寫幾個驗證密碼的小程序 看看在不同情況下程序的反應

我們先寫一個驗證密碼登錄的小程序

當密碼驗證字符為phntm的時候 授權登錄

Codz: 
@echo off 
cls 
:allyesno 
set errorlevel=>nul 
echo 請輸入登錄口令 
set/p password= 
echo %password%|findstr phntm 
if %errorlevel%== echo 口令正確&goto end 
echo 口令錯誤&goto allyesno 
:end 
echo 你成功登錄系統



將bat保存為keybat執行

執行結果

Codz: 
C:test>key 
請輸入登錄口令 
test 
口令錯誤 
請輸入登錄口令 
phnt
phntm 
口令正確 
你成功登錄系統



事實 上 上面的代碼用來進行一般的口令驗證已經足夠了 但是 要達到我們的目的 任意字符過濾還不行
我們換個方式執行看看

執行結果
Codz: 
C:test>key 
請輸入登錄口令 
test 
口令錯誤 
請輸入登錄口令 
 
|findstr phntm 
口令錯誤 
請輸入登錄口令 
phnt
phntm 
口令正確 
你成功登錄系統



看見了嗎 當我們輸入 字符的時候 程序報錯了 並顯示了密碼 為什麼會這樣呢? 我們再看這個語句的語法結構 echo %password%|findstr phntm 當%password%=的時候 就是echo |findstr phntm

之所以會如此 跟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 phntm 
if %errorlevel%== echo 口令正確&goto end 
echo 口令錯誤&goto allyesno 
:end 
echo 你成功登錄系統



執行結果如下

Codz: 
請輸入登錄口令 
test 
口令錯誤 
請輸入登錄口令 
 
口令錯誤 
請輸入登錄口令 
phnt
password=phnt
口令正確 
你成功登錄系統 

C:\test>



程序進一步的完美了

但是還是有問題D 我們再來看 換一種方式執行

Codz: 
請輸入登錄口令 
test 
口令錯誤 
請輸入登錄口令 
phntmallyesno 
password=phntmallyesno 
口令正確 
你成功登錄系統 

C:test>



由於程序的驗證方式是 set |findstr phntm 所以只要包含phntm字符的 密碼 都被當成正確密碼 所以密碼phntmallyesno 也通過了

為了避免這個問題 我設置了 匹配參數\<\> 對數據進行檢驗 修改後的程序 如下

Codz: 
@echo off 
cls 
:allyesno 
set errorlevel=>nul 
echo 請輸入登錄口令 
set/p password= 
set |findstr \<phntm\> 
if %errorlevel%== echo 口令正確&goto end 
echo 口令錯誤&goto allyesno 
:end 
echo 你成功登錄系統



執行結果

Codz: 
請輸入登錄口令 
test 
口令錯誤 
請輸入登錄口令 
phntmallyesno 
口令錯誤 
請輸入登錄口令 
phnt
password=phnt
口令正確 
你成功登錄系統 

C:test>



最後再將程序 修整 如下 

Codz: 
@echo off 
cls 
:allyesno 
set errorlevel=>nul 
echo 請輸入登錄口令 
set/p password= 
rem 如果密碼字符串包含此行任一字符_+|=[]{};:/>~`!@#$%^&*()_+|=[]{};:/<>? 則必須使用匹配模式<> 
rem 需要雙寫的字符 
rem 不可以作為密碼的字符  
set password|findstr \<phntm\> 
if %errorlevel%== echo 口令正確&goto end 
echo 口令錯誤&goto allyesno 
:end 
set password=>nul 
echo 你成功登錄系統



當密碼字符串中有字符\的時候 需要將字符雙寫\\ 
例 set password|findstr \<\\\>
登錄的時候 只需要寫一次\不需要雙寫

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

From:http://tw.wingwit.com/Article/program/qrs/201405/31030.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.