2015-04-04 17 views
0

我正在批量生成一個密碼掩碼,但我需要獲取某個變量的字母才能工作。我運行Windows 7。這裏是我的代碼:批量獲得(TEXT)的字母(X)

@echo off 
title Password 
set Pass= 
set Letters=abcdefghijklmnopqrstuvwxyz 

:Loop 
cls 
echo. 
echo Password: %Pass% 
choice /c:%Letters% /n 
for /l %%a in (1,1,26) do if %errorlevel%==%%a set Pass=%Pass% (Letter %%a of %Letters%) 
goto Loop 
+0

爲什麼要重新發明輪子? http://stackoverflow.com/a/22282223是一個驚人的密碼掩碼。 – SomethingDark 2015-04-04 04:48:26

+0

只是說在你的問題中問這個問題很有幫助。 – foxidrive 2015-04-04 05:10:14

+0

在這裏你可以找到幾個maskers - http://stackoverflow.com/a/24396149/388389 – npocmaka 2015-04-04 06:28:06

回答

1
@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位置恢復從choiceerrorlevel輸出的(這也是您使用的原始字符串。)

最後一點變化就是,我增加了一個額外的字符到最後。我選擇0,它被用作exit字符。

在輸入0時,errorlevel將爲27,所以我們明確檢查該值。如果輸入0,則退出程序(當然可以是任何標籤),否則它必須是1..26,因此請檢查字母表。

+0

我通過代碼過濾,刪除了兩個額外的%符號,(它沒有與他們合作),但它給了我後值我按什麼,例如,當我按a時,它鍵入b。 – JoshyRobot 2015-04-05 17:42:54

+0

沒關係,我在'選擇'命令中沒有看到':〜1'。 :p – JoshyRobot 2015-04-05 21:19:56