批处理文件不接受%1,%2形式的参数



我有一个简单的脚本,做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

最新更新