如何用批处理文件ftp?

时间:2013-04-22 22:59:34

标签: windows batch-file ftp

我想要一个批处理文件ftp到服务器,读出一个文本文件,然后断开连接。服务器需要用户和密码。我试过了

@echo off
pause
@ftp example.com
username
password
pause

但它从未登录过。我怎样才能让它发挥作用?

10 个答案:

答案 0 :(得分:51)

0x90h的回答帮了很多...

我将此文件保存为u.ftp:

open 10.155.8.215 
user
password
lcd /D "G:\Subfolder\"
cd  folder/
binary
mget file.csv
disconnect
quit

然后我运行了这个命令:

ftp -i -s:u.ftp

它有效!!!

非常感谢你:)

答案 1 :(得分:45)

使用Windows FTP客户端,您可以使用-s:filename选项指定FTP客户端运行的脚本。该文档特别指出,您不应尝试使用<字符将输入传输到FTP客户端。

脚本的执行将立即开始,因此它适用于用户名/密码。

但是,此设置的安全性值得怀疑,因为您现在拥有FTP服务器的用户名和密码,对于决定查看批处理文件的任何人都可以看到。

无论哪种方式,您都可以从批处理文件中动态生成脚本文件,然后将其传递给FTP客户端,如下所示:

@echo off

REM Generate the script. Will overwrite any existing temp.txt
echo open servername> temp.txt
echo username>> temp.txt
echo password>> temp.txt
echo get %1>> temp.txt
echo quit>> temp.txt

REM Launch FTP and pass it the script
ftp -s:temp.txt

REM Clean up.
del temp.txt

servername 用户名密码替换为您的详细信息,批处理文件将生成脚本temp.txt启动ftp与脚本然后删除脚本。

如果您始终获得相同的文件,则可以使用文件名替换%1。如果不是,您只需启动批处理文件并提供要作为参数获取的文件的名称。

答案 2 :(得分:11)

这是一个旧帖子,但另一种方法是使用命令选项:

ftp -n -s:ftpcmd.txt

-n将禁止初始登录,然后文件内容为:(用您的FTP站点URL替换127.0.0.1)

open 127.0.0.1
user myFTPuser myftppassword
other commands here...

这可以避免单独行上的用户/密码

答案 3 :(得分:6)

您需要在文本文件中编写ftp命令并将其作为ftp命令的参数提供,如下所示:

ftp -s:filename

此处有更多信息:http://www.nsftools.com/tips/MSFTP.htm

我不确定它是否适用于用户名和密码提示。

答案 4 :(得分:5)

批处理文件的每一行都将被执行;但只有在前一行完成之后。在您的情况下,一旦它到达ftp行,ftp程序将启动并接管用户输入。当它关闭时,其余的行将执行。这意味着用户名/密码永远不会被发送到FTP程序,而是在ftp程序关闭后将被提供给命令提示符。

相反,您需要在ftp命令行上传递所需的一切。类似的东西:

@echo off
echo user MyUserName> ftpcmd.dat
echo MyPassword>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %1>> ftpcmd.dat
echo quit>> ftpcmd.dat
ftp -n -s:ftpcmd.dat SERVERNAME.COM
del ftpcmd.dat

答案 5 :(得分:5)

使用

ftp -s:FileName 

Windows XP Professional Product Documentation中描述。

您必须指定的文件名代替 FileName 必须包含要发送到服务器的FTP命令。其中的命令是

  • 打开计算机[端口] 以连接到FTP服务器,
  • 用户名[密码] [帐户] ,以便通过FTP服务器进行身份验证,
  • 获取RemoteFile [LocalFile] 以检索文件
  • 退出以结束FTP会话并终止ftp程序。

可在Ftp subcommands下找到更多命令。

答案 6 :(得分:1)

您也可以使用PowerShell;这就是我做的。因为我需要根据模式下载文件,所以我动态创建了一个命令文件,然后让ftp完成剩下的工作。

我使用了基本的PowerShell命令。我不需要下载任何其他组件。我首先检查是否存在必需数量的文件。如果我们第二次使用Mget调用FTP。 我从连接到Windows XP远程服务器的Windows Server 2008运行它。

function make_ftp_command_file($p_file_pattern,$mget_flag)
{
    # This function dynamically prepares the FTP file.
    # The file needs to be prepared daily because the
    # pattern changes daily.
    # PowerShell default encoding is Unicode.
    # Unicode command files are not compatible with FTP so
    # we need to make sure we create an ASCII file.

    write-output "USER" | out-file -filepath C:\fc.txt -encoding ASCII
    write-output "ftpusername" | out-file -filepath C:\fc.txt -encoding ASCII -Append
    write-output "password" | out-file -filepath C:\fc.txt -encoding ASCII -Append
    write-output "ASCII" | out-file -filepath C:\fc.txt -encoding ASCII -Append
    If ($mget_flag -eq "Y")
    {
        write-output "prompt" | out-file -filepath C:\fc.txt -encoding ASCII -Append
        write-output "mget $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
    }
    else
    {
        write-output "ls $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
    }

    write-output quit | out-file -filepath C:\fc.txt -encoding ASCII -Append
}


###########################  Init Section ###############################
$yesterday = (get-date).AddDays(-1)
$yesterday_fmt = date $yesterday -format "yyyyMMdd"
$file_pattern = "BRAE_GE_*" + $yesterday_fmt + "*.csv"
$file_log = $yesterday_fmt + ".log"

echo  $file_pattern
echo  $file_log


############################## Main Section ############################
# Change location to folder where the files need to be downloaded
cd c:\remotefiles

# Dynamically create the FTP Command to get a list of files from
# the remote servers
echo "Call function that creates a FTP Command "
make_ftp_command_file $file_pattern N


#echo "Connect to remote site via FTP"
# Connect to Remote Server and get file listing
ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log

$matches=select-string -pattern "BRAE_GE_[A-Z][A-Z]*" C:\logs\$file_log

# Check if the required number of Files available for download
if ($matches.count -eq 36)
{
    # Create the FTP command file

    # This time the command file has an mget rather than an ls
    make_ftp_command_file $file_pattern Y

    # Change directory if not done so
    cd c:\remotefiles

    # Invoke ftp with newly created command file
    ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log
}
else
{
    echo "The full set of files is not available"
}

答案 7 :(得分:0)

这是我使用的。在我的情况下,某些ftp服务器(纯ftpd为一个)将始终提示用户名,即使使用-i参数,并捕获&#34;用户用户名&#34;命令作为交互密码。我做了什么输入几个NOOP(无操作)命令,直到ftp服务器超时,然后登录:

open ftp.example.com 
noop
noop
noop
noop
noop
noop
noop
noop
user username password
...
quit

答案 8 :(得分:0)

如果您需要将变量传递到txt文件,则可以即时创建并在之后删除。

这是一个以管理员身份运行的批处理脚本示例。它使用一些日期和时间变量创建一个zip文件。然后,它会动态创建带有某些变量的ftp文本文件。然后删除zip,文件夹和ftp文本文件。

set YYYY=%DATE:~10,4%
set MM=%DATE:~4,2%
set DD=%DATE:~7,2%

set HH=%TIME: =0%
set HH=%HH:~0,2%
set MI=%TIME:~3,2%
set SS=%TIME:~6,2%
set FF=%TIME:~9,2%

set dirName=%YYYY%%MM%%DD%
set fileName=%YYYY%%MM%%DD%_%HH%%MI%%SS%.zip

echo %fileName%

"C:\Program Files\7-Zip\7z.exe" a -tzip C:\%dirName%\%fileName% -r "C:\tozip\*.*" -mx5

(
    echo open 198.123.456.789
    echo user@somedomain.com
    echo yourpassword
    echo lcd "C:/%dirName%"
    echo cd  theremotedir
    echo binary
    echo mput *.zip
    echo disconnect
    echo bye
) > C:\ftp.details.txt


cd C:\
FTP -v -i -s:"ftp.details.txt"

del C:\ftp.details.txt /f

答案 9 :(得分:-1)

我已将脚本编写为* .sh文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromXDelta="100%"
        android:toXDelta="0%" >
    </translate>
</set>

适合我的工作