批量读取文本文件中的数据。循环时存储在两个临时变量中
read data from text file in batch. store in two temporary variables when looping
正在尝试从文本文件中读取用户名和密码,每个用户名和密码在 txt 文件中以新行分隔。
无法遍历数组并从数组中获取第一个元素和第二个元素并分配给 varUser
和 varPass
,然后是第三个和第四个,依此类推。这两个临时变量将用作登录 sftp 服务器的 winScp 控制台的参数。 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
)
这假设您的 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
正在尝试从文本文件中读取用户名和密码,每个用户名和密码在 txt 文件中以新行分隔。
无法遍历数组并从数组中获取第一个元素和第二个元素并分配给 varUser
和 varPass
,然后是第三个和第四个,依此类推。这两个临时变量将用作登录 sftp 服务器的 winScp 控制台的参数。 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
)
这假设您的 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