在批处理文件中读取行 - 如何读取成对的远程行

时间:2013-06-14 04:00:04

标签: batch-file

我正在尝试制作批处理文件,以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读取然后写入?显然,我在这里尝试的方法不起作用。

此致 用户

2 个答案:

答案 0 :(得分: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 ... account5 密码1 ... password5

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

得到了

account1密码1 ... account5密码5

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

答案 1 :(得分: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
)