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

时间:2011-08-23 08:30:33

标签: windows batch-file

我有一个简单的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端,完全没有意义。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

那是因为,在您实际处理文件时,它根本不是批处理脚本。

这是一个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%"

答案 1 :(得分:0)

问题在于您将有问题的文件作为一组命令传递给ftp,并使用-s开关 - “%~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