@ECHO OFF
SETLOCAL
REM title Password
set Pass=
set Letters=#abcdefghijklmnopqrstuvwxyz0
:Loop
cls
echo.
echo Password: %Pass%
choice /c:%Letters:~1% /n
IF ERRORLEVEL 27 GOTO :EOF
for /l %%a in (1,1,26) do if %errorlevel%==%%a CALL set Pass=%Pass% %%Letters:~%%a,1%%
goto Loop
GOTO :EOF
這裏有一個如何做批處理。
該方法的核心是CALL set Pass=%Pass% %%Letters:~%%a,1%%
這是一個解析特技。到call
的參數被解析爲
- 設置
- 通= originalvalueofpass 空間
- %快報:〜 thevalueofawhenmatchwasfound,1%
所以,按c
將使errorlevel
和因此%%a
= 3匹配時,所以%letters:~%%a,1%
將是%letters:~3,1%
使用批次子串。 %letters:~3,1%
表示取自letters
的子串,從位置3開始,爲1個字符。
子串的語法是
%var:~start,length% if start >=0 and length >0
%var:~start,endpos% if start >=0 and endpos <0
%var:~start,length% if start <0 and length >0
%var:~start,endpos% if start <0 and endpos <0
- 長度/可省略endpos。如果省略,子是「從起始位置到結束」
%
可能是!
爲delayedexpansion
模式
但這裏的困難:此子方法開始於0
計數,我們有errorlevel
爲信c
= 3
。使用子串,a = 0,b = 1,c = 2,...
所以我們通過在letters
的開頭添加一個額外的字符來作弊。使用這個額外的字符,%letters:~3,1%
產生的字母是c
。我選擇了#
- 但任何角色都可以。
然後,我們通過使用letters
子串開始1
位置恢復從choice
errorlevel
輸出的(這也是您使用的原始字符串。)
最後一點變化就是,我增加了一個額外的字符到最後。我選擇0
,它被用作exit
字符。
在輸入0
時,errorlevel將爲27
,所以我們明確檢查該值。如果輸入0
,則退出程序(當然可以是任何標籤),否則它必須是1..26,因此請檢查字母表。
爲什麼要重新發明輪子? http://stackoverflow.com/a/22282223是一個驚人的密碼掩碼。 – SomethingDark 2015-04-04 04:48:26
只是說在你的問題中問這個問題很有幫助。 – foxidrive 2015-04-04 05:10:14
在這裏你可以找到幾個maskers - http://stackoverflow.com/a/24396149/388389 – npocmaka 2015-04-04 06:28:06