尝试从文本文件中读取用户名和密码,每个用户名和密码在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
)
答案 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
读取文件并给行编号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