批量获取(TEXT)的字母(X)

get letter (X) of (TEXT) in batch

我正在批量制作密码掩码,但我需要获取某个变量的特定字母才能使其工作。我是 运行 Windows 7. 这是我的代码:

@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
@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 的参数被解析为

  • 设置
  • Pass=originalvalueofpassSpace
  • %字母:~发现匹配时的值,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
  • length/endpos 可以省略。如果省略,则子串为 "from the start position to the end"
  • % 对于 delayedexpansion 模式
  • 可能是 !

但这就是困难所在:此子字符串方法从 0 开始计数,我们有 errorlevel 字母 c = 3。使用子串,a=0,b=1,c=2,...

所以我们通过在letters的开头添加一个额外的字符来作弊。使用这个额外的字符,%letters:~3,1% 生成的字母是所需的 c。我选择了 # - 但任何角色都可以。

然后我们使用从 1 位置开始的 letters 的子字符串(这是您使用的原始子字符串)恢复 choiceerrorlevel 输出。 =41=]

最后一点改动是我在末尾添加了一个额外的字符。我选择 0 并用作 exit 字符。

输入 0 时,错误级别将为 27,因此我们明确检查该值。如果输入 0,则退出程序(当然可以是任何标签),否则,它必须是 1..26 所以去检查字母表。