【发布时间】:2016-10-05 13:26:47
【问题描述】:
以下批处理文件未正确地将变量 %%a、%%b、%%c 正确传递给子程序。
@echo off
enter code here`setlocal EnableDelayedExpansion
FOR /F "tokens=1,2,3 delims= " %%a in (ftp_config.txt) do (
echo %%a
echo %%b
echo %%c
call :SUB_ftp_cmd %%a %%b %%c
)
exit
:SUB_ftp_cmd
echo open %1>ftp.txt
echo %2>>ftp.txt
echo %3>>ftp.txt
echo cd /public_html>>ftp.txt
echo bin>>ftp.txt
echo hash>>ftp.txt
echo put "test.txt">>ftp.txt
echo close>>ftp.txt
echo bye>>ftp.txt
c:\windows\system32\ftp.exe -i <ftp.txt
del ftp.txt
exit /b
ftp.config 包含以下内容:
domain_name1 username1 password1
domain_name2 username2 password2
ftp.txt 的内容最终是:
open
ECHO is off.
ECHO is off.
cd /public_html
bin
hash
put "test.txt"
close
bye
我在调试中添加了几行代码,发现 %%a、%%b、%%c 在 FOR 循环中被正确分配,但没有正确传递给 SUB_ftp_cmd。
将批处理文件更新为:
@echo off
setlocal DisableDelayedExpansion
FOR /F "tokens=1,2,* delims= " %%a in (ftp_config.txt) do (
echo(=== for loop variables: a=[%%a], b=[%%b], c=[%%c]
set "passw=%%c"
call :SUB_ftp_cmd %%a %%b
)
exit /B
:SUB_ftp_cmd
SETLOCAL EnableDelayedExpansion
>ftp.txt (
echo open %1
echo(%2
echo(!passw!
echo cd /public_html
echo bin
echo hash
echo put "test.txt"
echo close
echo bye
)
ENDLOCAL
echo(=== ftp.txt content
type ftp.txt
echo(=== ftp command is merely displayed using `ECHO`
ECHO c:\windows\system32\ftp.exe -i -s:ftp.txt
echo(
rem del ftp.txt
exit /b
ftp_config.txt 有:
"ftp.domain1.com" username1 pas3&^#%$
"ftp.domain2.com" username2 passworks
生成的 ftp.txt:
open "ftp.domain2.com"
username2
cd /public_html
bin
hash
put "test.txt"
close
bye
感谢任何帮助。
【问题讨论】:
-
ftp /?表示应该使用ftp -i -s:ftp.txt而不是ftp.exe -i <ftp.txt。但是,您的脚本可能会使用setlocal DisableDelayedExpansion正确运行,以在密码中保留可能的!感叹号。我会使用FOR /F "tokens=1,2,*" %%a in (ftp_config.txt) do …和call :SUB_ftp_cmd %%a %%b "%%c"和echo %~3>>ftp.txt
标签: windows batch-file ftp arguments