bat過濾任意字元

2022-04-04 08:04:59 字數 3883 閱讀 1079

by:allyesno   from:

早在寫 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 "\<\\\>"

登入的時候 只需要寫一次\不需要雙寫

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

bat生成任意位數數字指令碼

經常遇到類似生成00 99,000 999,0000 9999 之類的數字文字。今天做乙個生成任意位數的數字指令碼。這裡涉及bat判斷是否帶引數,連乘,左邊補0等。指令碼 echo off setlocal enabledelayedexpansion if 1 neq set ch 1 else ...

過濾非法字元

using system using system.componentmodel using system.collections using system.diagnostics using system.data using system.data.sqlclient using system....

過濾非法字元

再度改進,在髒字可能存在的情況下,例如出現了多個髒字前length 1部分時,效能相比http www.cnblogs.com xingd archive 2008 01 31 1060425.html 中描述的又提公升了300 400 直接貼出全部 了,通過新增的乙個byte char.maxva...