早在寫 bat的一個小游戲猜數字的時候我就研究過這個問題 如何在bat裡面實現 對輸入的任意字符進行過濾 當時使用的幾種方法如下
Codz:
if
例: if
set errorlevel=
echo 要過濾的字符|find
if
if
主要是使用這兩種方法 這兩種方法可以過濾數字 和 英文字母 但是 對 特殊字符 不起作用
當要過濾【_+|
Codz:
echo
注意到有什麼不同了嗎 是的 我們加入了
這個問題 困擾了 我半年之久 曾在安焦上 問了一下 沒人回答
事實上要過濾它 並不是那麼的簡單 我們先寫幾個驗證密碼的小程序 看看在不同情況下程序的反應
我們先寫一個驗證密碼登錄的小程序
注
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 請輸入登錄口令
set/p password=
echo
if
echo 口令錯誤&goto allyesno
:end
echo 你成功登錄系統
將bat保存為key
執行結果
Codz:
C:test>key
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph
口令正確
你成功登錄系統
事實 上 上面的代碼用來進行一般的口令驗證已經足夠了 但是 要達到我們的目的 任意字符過濾還不行
我們換個方式執行看看
執行結果
Codz:
C:test>key
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
口令錯誤
請輸入登錄口令
ph
口令正確
你成功登錄系統
看見了嗎 當我們輸入
之所以會如此 跟echo的特性有關 我們看下面幾個語句
Codz:
I:>echo
I:>echo
I:
I:>echo
I:>echo
I:
當
這裡我想了一個辦法繞過echo的報錯特性 我用set代替了echo 程序如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 請輸入登錄口令
set/p password=
set |findstr
if
echo 口令錯誤&goto allyesno
:end
echo 你成功登錄系統
執行結果如下
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
口令錯誤
請輸入登錄口令
ph
password=ph
口令正確
你成功登錄系統
C:\test>
程序進一步的完美了
但是還是有問題D 我們再來看 換一種方式執行
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph
password=ph
口令正確
你成功登錄系統
C:test>
由於程序的驗證方式是 set |findstr
為了避免這個問題 我設置了 匹配參數\<\> 對數據進行檢驗 修改後的程序 如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 請輸入登錄口令
set/p password=
set |findstr
if
echo 口令錯誤&goto allyesno
:end
echo 你成功登錄系統
執行結果
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph
口令錯誤
請輸入登錄口令
ph
password=ph
口令正確
你成功登錄系統
C:test>
最後再將程序 修整 如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 請輸入登錄口令
set/p password=
rem 如果密碼字符串包含此行任一字符_+|
rem 需要雙寫的字符
rem 不可以作為密碼的字符
set password|findstr
if
echo 口令錯誤&goto allyesno
:end
set password=>nul
echo 你成功登錄系統
注
例 set password|findstr
登錄的時候 只需要寫一次\不需要雙寫
From:http://tw.wingwit.com/Article/program/qrs/201405/31030.html