从文本文件中批量读取数据。循环时存储在两个临时变量中

时间:2019-05-10 19:05:27

标签: arrays batch-file winscp

尝试从文本文件中读取用户名和密码,每个用户名和密码在txt文件的新行中分开。 无法遍历数组并从数组中获取第一个元素和第二个元素,并分别分配给varUservarPass,然后分配给第三和第四,依此类推。这两个临时变量将用作登录sftp服务器的winScp控制台的参数。 script.txt文件具有连接命令,该命令以批处理文件中的varUservarPass作为参数。

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 个答案:

答案 0 :(得分:1)

仅给出一个没有数组且没有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

答案 1 :(得分:0)

这假设您的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
)

根据您的最新评论,这最后一个示例就是您想要的。

答案 2 :(得分:0)

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

第一个循环周期设置varUser的值,第二个循环周期执行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!

答案 3 :(得分:0)

另一个变种,使用

  • findstr /n读取文件并给行编号
  • 带有第2步的for /l用于处理数组

带有文件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