Intentando leer el nombre de usuario y la contraseña del archivo de texto, cada nombre de usuario y contraseña separados en una nueva línea en el archivo txt. No puede iterar sobre la matriz y obtener el primer elemento y el segundo elemento de la matriz y asignarlos a varUser y varPass, luego tercero y cuarto y así sucesivamente. Estas dos variables temporales se utilizarán como parámetro para la consola winScp para el servidor sftp de inicio de sesión. El archivo script.txt tiene un comando para conectarse que toma varUser y varPass como parámetro del archivo por lotes.

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
)
-1
Nikhil_buzz_light_year 10 may. 2019 a las 22:05

4 respuestas

La mejor respuesta

Esto supone que su file.txt está construido como:

user1 password1
user2 password2
user3 password3
...

Esto hace exactamente lo que intentó en 2 bucles (además de intentar establecer una matriz)

@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!
)

Sin embargo, eso es bastante innecesario, ya que simplemente puede usar las metavariables como es ejecutar los comandos.

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

Si realmente desea establecer una matriz y usarla como lo hizo, por una razón desconocida:

@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]!
)

Si, por otro lado, su file.txt está en forma de lista completa, como:

user1
password1
user2
password2
user3
password3
...

Entonces esto es probablemente lo que quería llegar a :)

@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
)

Este último ejemplo es lo que parece querer, basado en su último comentario.

0
Gerhard Barnard 14 may. 2019 a las 08:55

Solo para dar una alternativa sin una matriz y sin 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

Suponiendo el siguiente formato (subóptimo) para file.txt:

user1
password1
user2
password2
user3
password3
1
Stephan 12 may. 2019 a las 08:00
@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.er ciclo de bucle para establecer el valor de varUser y el segundo ciclo de bucle para ejecutar winscp. Se mantendrá en bucle hasta que llegue al final del archivo. Quizás más fácil de lo que intentó con una secuencia de nombre variable.

Esto funcionará con la lectura de un archivo como:

jack
boy
jill
girl!

Si coloca el usuario y la contraseña en la misma línea para cada usuario, entonces podría usar:

@echo off
setlocal

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

Esto funcionará con la lectura de un archivo como:

jack boy
jill girl!
0
michael_heath 11 may. 2019 a las 07:08

Solo otra variante, usando

  • findstr /n para leer el archivo y numerar las líneas
  • a for /l con el paso 2 para procesar la matriz

Con un archivo UserPass.txt:

user1
password1
user2
password2
user3
password3

Este lote:

:: 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!
)

Produce esta salida (elimine echo delante de 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
user6811411user6811411 11 may. 2019 a las 11:41