bat過濾任意字符
更新時間:2006年09月08日 00:00:00 作者:
文章作者:allyesno
早在寫 bat的一個小游戲猜數(shù)字的時候我就研究過這個問題 如何在bat里面實(shí)現(xiàn) 對輸入的任意字符進(jìn)行過濾 當(dāng)時使用的幾種方法如下
Codz:
if "%1"=="要過濾的字符" echo 你輸入的是非法字符
例: if "%1"=="wrongpassword" echo 錯誤口令
set errorlevel=0
echo 要過濾的字符|find "要過濾的字符"
if "%errorlevel%"=="0" echo 你輸入的是是非法字符
if "%errorlevel%"=="1" echo 該字符串不在非法列表中
主要是使用這兩種方法 這兩種方法可以過濾數(shù)字 和 英文字母 但是 對 特殊字符 不起作用
當(dāng)要過濾【_+|-=\[]{};':,./">~`!@#$%^&*()_+|-=\[]{};':,./<>? 】(包含空格和tab鍵值)的時候 我們要這樣
Codz:
echo "anyword"|find "anywrod"
注意到有什么不同了嗎 是的 我們加入了""來包含anyword 可是過濾到此并沒完成 發(fā)現(xiàn)上面要過濾的字符 少了什么嗎 是的 少了" 字符本身 遺憾的是 這種方法 無法完美的過濾"字符本身 當(dāng)" 取值 為奇數(shù) 和 偶數(shù)的 時候 用find對她進(jìn)行 過濾 隨條件 不同可能會報錯
這個問題 困擾了 我半年之久 曾在安焦上 問了一下 沒人回答
事實(shí)上要過濾它 并不是那么的簡單 我們先寫幾個驗證密碼的小程序 看看在不同情況下程序的反應(yīng)
我們先寫一個驗證密碼登錄的小程序
注:當(dāng)密碼驗證字符為ph4nt0m的時候 授權(quán)登錄
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 你成功登錄系統(tǒng)
將bat保存為key.bat執(zhí)行
執(zhí)行結(jié)果
Codz:
C:test>key
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph4nt0m
"ph4nt0m"
口令正確
你成功登錄系統(tǒng)
事實(shí) 上 上面的代碼用來進(jìn)行一般的口令驗證已經(jīng)足夠了 但是 要達(dá)到我們的目的 任意字符過濾還不行
我們換個方式執(zhí)行看看
執(zhí)行結(jié)果
Codz:
C:test>key
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
"
"""|findstr "ph4nt0m"
口令錯誤
請輸入登錄口令
ph4nt0m
"ph4nt0m"
口令正確
你成功登錄系統(tǒng)
看見了嗎 當(dāng)我們輸入" 字符的時候 程序報錯了 并顯示了密碼 為什么會這樣呢? 我們再看這個語句的語法結(jié)構(gòu) echo "%password%"|findstr "ph4nt0m" 當(dāng)%password%="的時候 就是echo """|findstr "ph4nt0m"
之所以會如此 跟echo的特性有關(guān) 我們看下面幾個語句
Codz:
I:>echo "|cd
"|cd
I:>echo ""|cd
I:
I:>echo """|cd
"""|cd
I:>echo """"|cd
I:
當(dāng)"為奇數(shù)的時候 則打印整行 當(dāng)"為偶數(shù)的時候則 執(zhí)行 | 字符后面的命令 上面程序執(zhí)行的命令是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 你成功登錄系統(tǒng)
執(zhí)行結(jié)果如下
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
"
口令錯誤
請輸入登錄口令
ph4nt0m
password=ph4nt0m
口令正確
你成功登錄系統(tǒng)
C:\test>
程序進(jìn)一步的完美了
但是還是有問題D 我們再來看 換一種方式執(zhí)行
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph4nt0mallyesno
password=ph4nt0mallyesno
口令正確
你成功登錄系統(tǒng)
C:test>
由于程序的驗證方式是 set |findstr "ph4nt0m" 所以只要包含ph4nt0m字符的 密碼 都被當(dāng)成正確密碼 所以密碼ph4nt0mallyesno 也通過了
為了避免這個問題 我設(shè)置了 匹配參數(shù)\<\> 對數(shù)據(jù)進(jìn)行檢驗 修改后的程序 如下
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 你成功登錄系統(tǒng)
執(zhí)行結(jié)果
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph4nt0mallyesno
口令錯誤
請輸入登錄口令
ph4nt0m
password=ph4nt0m
口令正確
你成功登錄系統(tǒng)
C:test>
最后再將程序 修整 如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 請輸入登錄口令
set/p password=
rem 如果密碼字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>? 則必須使用匹配模式<>
rem 需要雙寫的字符
rem 不可以作為密碼的字符 "
set password|findstr "\<ph4nt0m\>"
if "%errorlevel%"=="0" echo 口令正確&goto end
echo 口令錯誤&goto allyesno
:end
set password=>nul
echo 你成功登錄系統(tǒng)
注:當(dāng)密碼字符串中有字符\的時候 需要將字符雙寫\\
例 set password|findstr "\<\\\>"
登錄的時候 只需要寫一次\不需要雙寫
" 字符 不可以作為密碼字符串 如果密碼字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>? 則必須使用匹配模式\<\>
早在寫 bat的一個小游戲猜數(shù)字的時候我就研究過這個問題 如何在bat里面實(shí)現(xiàn) 對輸入的任意字符進(jìn)行過濾 當(dāng)時使用的幾種方法如下
Codz:
if "%1"=="要過濾的字符" echo 你輸入的是非法字符
例: if "%1"=="wrongpassword" echo 錯誤口令
set errorlevel=0
echo 要過濾的字符|find "要過濾的字符"
if "%errorlevel%"=="0" echo 你輸入的是是非法字符
if "%errorlevel%"=="1" echo 該字符串不在非法列表中
主要是使用這兩種方法 這兩種方法可以過濾數(shù)字 和 英文字母 但是 對 特殊字符 不起作用
當(dāng)要過濾【_+|-=\[]{};':,./">~`!@#$%^&*()_+|-=\[]{};':,./<>? 】(包含空格和tab鍵值)的時候 我們要這樣
Codz:
echo "anyword"|find "anywrod"
注意到有什么不同了嗎 是的 我們加入了""來包含anyword 可是過濾到此并沒完成 發(fā)現(xiàn)上面要過濾的字符 少了什么嗎 是的 少了" 字符本身 遺憾的是 這種方法 無法完美的過濾"字符本身 當(dāng)" 取值 為奇數(shù) 和 偶數(shù)的 時候 用find對她進(jìn)行 過濾 隨條件 不同可能會報錯
這個問題 困擾了 我半年之久 曾在安焦上 問了一下 沒人回答
事實(shí)上要過濾它 并不是那么的簡單 我們先寫幾個驗證密碼的小程序 看看在不同情況下程序的反應(yīng)
我們先寫一個驗證密碼登錄的小程序
注:當(dāng)密碼驗證字符為ph4nt0m的時候 授權(quán)登錄
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 你成功登錄系統(tǒng)
將bat保存為key.bat執(zhí)行
執(zhí)行結(jié)果
Codz:
C:test>key
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph4nt0m
"ph4nt0m"
口令正確
你成功登錄系統(tǒng)
事實(shí) 上 上面的代碼用來進(jìn)行一般的口令驗證已經(jīng)足夠了 但是 要達(dá)到我們的目的 任意字符過濾還不行
我們換個方式執(zhí)行看看
執(zhí)行結(jié)果
Codz:
C:test>key
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
"
"""|findstr "ph4nt0m"
口令錯誤
請輸入登錄口令
ph4nt0m
"ph4nt0m"
口令正確
你成功登錄系統(tǒng)
看見了嗎 當(dāng)我們輸入" 字符的時候 程序報錯了 并顯示了密碼 為什么會這樣呢? 我們再看這個語句的語法結(jié)構(gòu) echo "%password%"|findstr "ph4nt0m" 當(dāng)%password%="的時候 就是echo """|findstr "ph4nt0m"
之所以會如此 跟echo的特性有關(guān) 我們看下面幾個語句
Codz:
I:>echo "|cd
"|cd
I:>echo ""|cd
I:
I:>echo """|cd
"""|cd
I:>echo """"|cd
I:
當(dāng)"為奇數(shù)的時候 則打印整行 當(dāng)"為偶數(shù)的時候則 執(zhí)行 | 字符后面的命令 上面程序執(zhí)行的命令是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 你成功登錄系統(tǒng)
執(zhí)行結(jié)果如下
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
"
口令錯誤
請輸入登錄口令
ph4nt0m
password=ph4nt0m
口令正確
你成功登錄系統(tǒng)
C:\test>
程序進(jìn)一步的完美了
但是還是有問題D 我們再來看 換一種方式執(zhí)行
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph4nt0mallyesno
password=ph4nt0mallyesno
口令正確
你成功登錄系統(tǒng)
C:test>
由于程序的驗證方式是 set |findstr "ph4nt0m" 所以只要包含ph4nt0m字符的 密碼 都被當(dāng)成正確密碼 所以密碼ph4nt0mallyesno 也通過了
為了避免這個問題 我設(shè)置了 匹配參數(shù)\<\> 對數(shù)據(jù)進(jìn)行檢驗 修改后的程序 如下
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 你成功登錄系統(tǒng)
執(zhí)行結(jié)果
Codz:
請輸入登錄口令
test
口令錯誤
請輸入登錄口令
ph4nt0mallyesno
口令錯誤
請輸入登錄口令
ph4nt0m
password=ph4nt0m
口令正確
你成功登錄系統(tǒng)
C:test>
最后再將程序 修整 如下
Codz:
@echo off
cls
:allyesno
set errorlevel=>nul
echo 請輸入登錄口令
set/p password=
rem 如果密碼字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>? 則必須使用匹配模式<>
rem 需要雙寫的字符
rem 不可以作為密碼的字符 "
set password|findstr "\<ph4nt0m\>"
if "%errorlevel%"=="0" echo 口令正確&goto end
echo 口令錯誤&goto allyesno
:end
set password=>nul
echo 你成功登錄系統(tǒng)
注:當(dāng)密碼字符串中有字符\的時候 需要將字符雙寫\\
例 set password|findstr "\<\\\>"
登錄的時候 只需要寫一次\不需要雙寫
" 字符 不可以作為密碼字符串 如果密碼字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>? 則必須使用匹配模式\<\>
相關(guān)文章
實(shí)現(xiàn)Win7系統(tǒng)快速一鍵切換用戶的bat腳本
這篇文章主要介紹了實(shí)現(xiàn)Win7系統(tǒng)快速一鍵切換用戶的bat腳本,簡單的一個批處理一鍵切換系統(tǒng)用戶的功能,需要的朋友可以參考下2014-06-06