2013-06-14 4 views
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? Очевидно, что метод, который я пробовал здесь, не работал.

С уважением, пользователь

+2

Показаны наши коды и говорят, что они не работают. Нам нехорошо, если вы не полностью объясняете ввод и нужный результат. Я понимаю, что входной файл слишком большой, чтобы опубликовать его целиком, но, по крайней мере, опубликовать некоторые фрагменты того, как выглядят строки. Также опишите конкретно, что не работает в вашем коде. – dbenham

ответ

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 для тестирования с файлом

account1 ... account5 password1 ... password5

(где ... есть недостающие строки, а не ...)

и получил

account1 password1 ... account5 password5

Оттуда вы сможете заставить его работать. Если нет, как говорит дбэнам, пожалуйста, будьте более конкретными и дайте примеры.

0

Ваш вопрос не совсем понятен и пропущен несколько деталей. Когда это произойдет, мы сможем угадать, чего вы пытаетесь достичь и заполнить пробелы в любом случае. Например:

  • Вы хотите обработать все строки текстового файла. Однако я не уверен, хотите ли вы обработать только определенное количество строк; например, до строки 1408. Почему это число? Поскольку это последняя строка блока из 32 строк до строки 1428, я полагаю, что у нее нет имени пользователя, а пароля.
  • Вы хотите соединить каждую линию с расположенной впереди 1427 строк.
  • Каждые 32 строки, которые вы хотите сделать «что-то другое», например, сохраните блок из 32 строк в другом файле.

Если размер входного файла меньше 64 МБ, вы можете загрузить весь файл в массив (переменные памяти). Например, если файл содержит в общей сложности 1408 + 1427 строк, то каждое имя пользователя или пароль может иметь до 64 МБ/2835 минус имя переменной = 23650 символов длиной приблизительно! Если каждое имя пользователя или пароль имеет 8 символов, а имя переменной использует 8 символов в среднем, то ваш файл может иметь строки 64 МБ/16 = 4 МБ! По этой причине, я думаю, этот метод является подходящим решением вашей проблемы. Когда строки загружаются в переменные памяти, у вас есть прямой доступ к любому из них.

Пакетный файл ниже загружает текстовый файл в массив 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 
) 
Смежные вопросы