0

我正在尝试制作一个批处理文件,以 32 个块的间隔存储数千个帐户的帐户名和密码。它将在每 32 个帐户的第一个帐户中执行不同的操作。我目前有这个:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
@set a=1
@set b=32
@set c=1
@set d=32
@set e=31
@set f=1
@set h=1427
FOR /f "delims=" %%g IN (acct.txt) DO (
 IF !a! EQU !f! (
  echo %%g >> ACCTS!f!-!b!.bat
  @set /a a=!a!+!c!
  ECHO %%g
  @set /a g=!g!+!h!
  ECHO %%g
  @set /a g=!g!-!h!
 ) ELSE (
  ECHO %%g
  echo %%g >> ACCTS!f!-!b!.bat
  @set /a a=!a!+!c!
 )
 IF !a! EQU !b! (
  echo %%g >> ACCTS!f!-!b!.bat
  @set /a b=!b!+!d!
  @set /a f=!f!+!d!
  @set /a a=!a!+!c!
  ECHO %%g
  pause
 )
)
ECHO FINISHED
pause

但是,我正在读取的文本文件包含 1427 行之外的密码,我需要将用户名和密码配对。有没有办法从 g 和 g+1427 读取然后写入?显然,我在这里尝试的方法不起作用。

问候,用户

4

2 回答 2

0

你的问题没有得到很好的解释,错过了几个细节。发生这种情况时,我们可以猜测您要达到的目标并以任何方式填补空白。例如:

  • 您想要处理文本文件的所有行。但是,我不确定您是否只想处理一定数量的行;例如,直到第 1408 行。为什么是这个数字?因为它是第 1428 行之前的 32 行块中的最后一行,所以我想它没有用户名,而是密码。
  • 您希望将每一行与前面放置的 1427 行配对。
  • 每 32 行你想做“不同的事情”,比如将 32 行的块存储在不同的文件中。

如果输入文件小于 64 MB,您可以将整个文件加载到数组中(内存变量)。例如,如果文件总共包含 1408+1427 行,那么每个用户名或密码最多可以有 64MB/2835 减去变量名 = 大约 23650 个字符!如果每个用户名或密码有 8 个字符,变量名平均使用 8 个字符,那么您的文件可能有 64MB/16 = 4 MB 行!出于这个原因,我认为这种方法是解决您问题的合适方法。当这些行被加载到内存变量中时,您可以直接访问它们中的任何一个。

下面的批处理文件将文本文件加载到line数组中,然后按照前面描述的方式对其进行处理。

@echo off
setlocal EnableDelayedExpansion

rem Load the file in "line" array
set index=0
for /F "delims=" %%a in (acct.txt) do (
   set /A index+=1
   set line[!index!]=%%a
)

rem Process the lines in blocks of 32
set /A numBlocks=1428/32, firstAcct=1

for /L %%b in (1,1,%numBlocks%) do (
   set /A lastAcct=firstAcct+31
   (for /L %%a in (!firstAcct!,1,!lastAcct!) do (
      set /A password=%%a+1427
      for %%p in (!password!) do echo Username: !line[%%a]!  Password: !line[%%p]!
   )) > ACCTS!firstAcct!-!lastAcct!.txt
   set /A firstAcct=lastAcct+1
)
于 2013-06-14T07:02:08.830 回答
0
@ECHO OFF
SETLOCAL enabledelayedexpansion
SET count=0
SET distance=5
:: create a temporary file with a dummy line, 
:: then numbered lines from the data file
ECHO 0:dummy >dummy.txt
TYPE acct.txt|FINDSTR /n "$">>dummy.txt
:: Now pair lines
(
FOR /l %%z IN (1,1,%distance%) DO (
 CALL :grabline account %%z
 SET /a skip=%%z+%distance%
 CALL :grabline password !skip!
 SET "account=!account:*:=!"
 SET "password=!password:*:=!"
 ECHO(!account! !password!
)
)>acctpass.txt

del dummy.txt

GOTO :eof
:grabline
FOR /f "skip=%2delims=" %%d IN (dummy.txt) DO SET "%1=%%d"&GOTO :eof
GOTO :eof

我不知道是什么"32 block intervals",但这是一个将位于定义距离处的线配对的例程。我用5的距离来测试一个文件

帐户 1 ... 帐户 5 密码 1 ... 密码 5

(其中 ... 是缺少的行,而不是...

并得到

帐户 1 密码 1 ... 帐户 5 密码 5

从那里,您应该能够使其工作。如果不是,正如 dbenham 所说,请更具体并举例说明。

于 2013-06-14T05:29:15.327 回答