читать данные из текстового файла в пакете. хранить в двух временных переменных при цикле - PullRequest
0 голосов
/ 10 мая 2019

Попытка прочитать имя пользователя и пароль из текстового файла, каждое имя пользователя и пароль отделяются в новой строке в текстовом файле. Невозможно перебрать массив и получить первый элемент и второй элемент из массива и присвоить varUser и varPass, затем третий и четвертый и так далее. Эти две временные переменные будут использоваться в качестве параметра для консоли winScp для входа на sftp сервер. Файл script.txt содержит команду для подключения, которая принимает varUser и varPass в качестве параметра из пакетного файла.

rem 1. reading text file and filling in array

for /F "usebackq delims=" %%a in (file.txt) do (
    set /A i+=1
    call echo i=%%i%%
    call set array[%%i%%]=%%a
    call set lastIndex=%%i%%
)

rem 2. reading array values from filled array and store in temp varUser and varPass

set /a i=0
set /a j=1
for /L %%i in (1,2,%lastIndex%) do (
    call echo %%array[%%i]%%
    set varUser=%%array[%%i]%%
    set varPass=%%array[%%j]%%
    winscp.com /script=script.txt /parameter put %varUser%,%varPass%
    set /a j+=1
)

Ответы [ 4 ]

1 голос
/ 12 мая 2019

просто чтобы дать альтернативу без массива и без for:

@echo off
<file.txt call :read
goto :eof

:read
  set "user="
  set "pass="
  set /p user=
  set /p pass=
  if "%user%%pass%"=="" goto :eof
  echo %user%, %pass%
goto :read

Предполагая следующий (неоптимальный) формат для file.txt:

user1
password1
user2
password2
user3
password3
0 голосов
/ 11 мая 2019
@echo off
setlocal
set "varUser="

for /f "delims=" %%A in (file.txt) do (
    if defined varUser (
        call winscp.com /script=script.txt /parameter put %%varUser%%,%%A
        set "varUser="
    ) else set "varUser=%%A"
)

1-й цикл цикла для установки значения varUser и 2-й цикл цикла для выполнения winscp. Это будет держать цикл, пока не достигнет конца файла. Возможно, проще, чем то, что вы пробовали с последовательностью имен переменных.

Это будет работать с чтением файла, такого как:

jack
boy
jill
girl!

Если вы поместите пользователя и пароль в одну строку для каждого пользователя, вы можете использовать:

@echo off
setlocal

for /f "tokens=1,2 delims= " %%A in (file2.txt) do (
    winscp.com /script=script.txt /parameter put %%A,%%B
)

Это будет работать с чтением файла, такого как:

jack boy
jill girl!
0 голосов
/ 11 мая 2019

Просто другой вариант, используя

  • findstr /n для чтения файла и нумерации строк
  • a for /l с шагом 2 для обработки массива

С файлом UserPass.txt:

user1
password1
user2
password2
user3
password3

Эта партия:

:: Q:\Test\2019\05\10\SO_56083497.cmd
@Echo off&SetLocal EnableDelayedExpansion

for /f "tokens=1*delims=:" %%i in ('findstr /N "." ^<".\UserPass.txt"'
    ) do Set "Array[%%i]=%%j"&Set n=%%i

for /l %%i in (1,2,%n%) do (
    Set /a j=%%i+1
    Call Set "varPass=%%Array[!j!]%%"
    echo winscp.com /script=script.txt /parameter put !Array[%%i]!,!varPass!
)

возвращает этот вывод (уберите echo перед winscp)

> Q:\Test\2019\05\10\SO_56083497.cmd
winscp.com /script=script.txt /parameter put user1,password1
winscp.com /script=script.txt /parameter put user2,password2
winscp.com /script=script.txt /parameter put user3,password3
0 голосов
/ 11 мая 2019

Предполагается, что ваш file.txt построен как:

user1 password1
user2 password2
user3 password3
...

Это именно то, что вы пытались сделать в 2 циклах (кроме попытки установить массив)

@echo off
setlocal enabledelayedexpansion    
for /F "usebackq tokens=1,*" %%a in ("file.txt") do (
    set varUser=%%a
    set varPass=%%b
    echo user=!varUser! password=!varPass!
    winscp.com /script=script.txt /parameter put !varUser!,!varPass!
)

То естьно в этом нет необходимости, поскольку вы можете просто использовать мета-переменные как есть для запуска команд.

@echo off
for /F "usebackq tokens=1,*" %%a in ("file.txt") do (
    winscp.com /script=script.txt /parameter put %%a,%%b
)

Если вы действительно хотите установить массив и использовать его, как вы это сделали, по неизвестной причине:

@echo off
setlocal enabledelayedexpansion
set cnt=0
for /f "usebackq tokens=1,*" %%a in ("file.txt") do (
    set /a cnt+=1
    set varUser[!cnt!]=%%a
    set varPass[!cnt!]=%%b
)

for /l %%i in (1,1,%cnt%) do (
    echo user=!varUser[%%i]! password=!varPass[%%i]!
)

Если, с другой стороны, ваш file.txt находится в полной форме списка, например:

user1
password1
user2
password2
user3
password3
...

Тогда это, вероятно, то, что вы хотели получить :)

@echo off
setlocal enabledelayedexpansion
set cnt=0
for /f "usebackq delims=" %%a in ("file.txt") do (
    set /a cnt+=1
    set array[!cnt!]=%%a
)

set handler=0
for /l %%i in (1,1,%cnt%) do (
    set /a handler+=1
    call set varUser=%%array[!handler!]%%
    set /a handler+=1
    call set varPass=%%array[!handler!]%%
    echo user=!varUser! password=!varPass!
    winscp.com /script=script.txt /parameter put !varUser!,!varPass!
    if "!handler!"=="!cnt!" goto :eof
)

Последний пример - это то, что вам нужно, основываясь на вашем последнем комментарии.

...