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

read data from text file in batch. store in two temporary variables when looping

正在尝试从文本文件中读取用户名和密码,每个用户名和密码在 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
)

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

根据您最后的评论,最后一个示例似乎是您想要的。

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

只是另一个变体,使用

  • findstr /n 读取文件并对行编号
  • a for /l 用步骤 2 处理数组

有文件UserPass.txt:

user1
password1
user2
password2
user3
password3

这批:

:: Q:\Test19\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!
)

产生此输出(删除 winscp 前面的 echo

> Q:\Test19\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

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