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
)
4 respuestas
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.
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
@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!
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
Nuevas preguntas
arrays
Una matriz es una estructura de datos lineal ordenada que consta de una colección de elementos (valores, variables o referencias), cada uno identificado por uno o más índices. Cuando pregunte sobre variantes específicas de matrices, utilice estas etiquetas relacionadas en su lugar: [vector], [lista de matrices], [matriz]. Cuando utilice esta etiqueta, en una pregunta que sea específica de un lenguaje de programación, marque la pregunta con el lenguaje de programación que se está utilizando.