我有一个简单的脚本,做ftp上传,关键是我想传递参数,如主机名,用户名,密码等进入bat
文件。
这是我的脚本
@ftp -i -s:"%~f0"&GOTO:EOF
open %1
%2
%3
!:--- FTP commands below here ---
lcd "%4"
cd %5
binary
put "%6"
disconnect
bye
现在,当我从命令行调用脚本并传入%1
, %2
…%1
, %2
内容不会被我的命令行参数所替换。这是我的命令行:
ftp.bat "first" "second" "third" "forth" "five" "six"
不是%1
变成first
, %2
变成second
,等等,%1
仍然是%1
,所以本质上我打开了一个名为%1
的ftp端,这完全没有意义。
我做错什么了吗?
这是因为,在实际处理文件时,它根本不是批处理脚本。
这是一个FTP脚本,它不做任何花哨的替换。
您可以使用临时文件(基于原始文件以避免冲突)获得所需的效果,如下所示:
@setlocal enableextensions enabledelayedexpansion
@echo off
set tmpfl=%~f0.tmp
echo>"%tmpfl%" open %1
echo>>"%tmpfl%" %2
echo>>"%tmpfl%" %3
echo>>"%tmpfl%" lcd "%4"
echo>>"%tmpfl%" cd %5
echo>>"%tmpfl%" binary
echo>>"%tmpfl%" put "%6"
echo>>"%tmpfl%" disconnect
echo>>"%tmpfl%" bye
type "%tmpfl%" && rem ftp -i -s:"%tmpfl%"
del /q "%tmpfl%"
endlocal
type
行在那里用于调试。当您对脚本满意时,更改:
type "%tmpfl%" && rem ftp -i -s:"%tmpfl%"
:
ftp -i -s:"%tmpfl%"
问题是,您正在将有问题的文件作为一组带有-s开关的命令传递给ftp - "%~f0"展开为批处理文件的完全限定文件名。因此,ftp客户端逐字解析文件,它不会用参数替换%1,%2等。这是由批处理文件处理程序完成的,而不是ftp客户端。
你可以尝试用"echo open %1> temp.txt"等方式写一个临时文件,然后将其作为ftp客户端的输入。
下面的代码似乎在我的系统上运行得很好:
echo open %1 > temp1.txt
echo %2 >> temp1.txt
echo %3 >> temp1.txt
rem !:--- FTP commands below here ---
echo lcd "%4" >> temp1.txt
echo cd %5 >> temp1.txt
echo binary >> temp1.txt
echo put "%6" >> temp1.txt
echo disconnect >> temp1.txt
echo bye >> temp1.txt
@call ftp -i -s:"temp1.txt"&GOTO:EOF