【问题标题】:Upload directory and files to FTP in Windows batchWindows批量上传目录和文件到FTP
【发布时间】:2017-02-25 09:32:24
【问题描述】:

我正在为 Windows 7 机器编写批处理脚本。该脚本的目标是将文件从目录C:\directory\source_dir\ 移动到ftp 服务器ftpserver.domain.com

不是所有的文件都应该上传到ftp服务器,所以我用的是正则表达式。

文件结构:

C:\directory\source_dir\TF_directory1
C:\directory\source_dir\TF_directory1\file1.txt
C:\directory\source_dir\TF_directory1\file2.txt
C:\directory\source_dir\TF_directory1\sub_dir\file_A.txt
C:\directory\source_dir\Ignore_directory\not_important.txt
C:\directory\source_dir\TF_123.CAM555.abc
C:\directory\source_dir\TF_123.CAM123.zyx
C:\directory\source_dir\TF_987.CAM555.abc
C:\directory\source_dir\wrong_file.txt

从上面的结构TF_directory1 和里面的所有东西都应该上传。 TF_123.CAM555.abcTF_123.CAM123.zyxTF_987.CAM555.abc 文件也应如此。

这是我的问题:

ftp put 命令返回目录错误

connected to ftpserver.domain.com
220 Welcome to the ftp server
ftp> user USERNAME
331 Please specify the password

---> PASS PASSWORD
230 Login successful.
ftp>
ftp> cd new_files
250 Directory successfully changed.
---> CWD new_files
ftp> put C:\directory\source_dir\"TF_123.CAM555.abc"
---> PORT 10,X,X,X,4,240
200 PORT command successful. Consider using PASV.
---> STOR TF_123.CAM555.abc
150 Ok to send data.
226 File receive OK.
ftp> put C:\directory\source_dir\TF_123.CAM123.zyx"
---> PORT 10,X,X,X,4,240
200 PORT command successful. Consider using PASV.
---> STOR TF_123.CAM555.abc
150 Ok to send data.
226 File receive OK.
ftp> put C:\directory\source_dir\TF_987.CAM555.abc"
---> PORT 10,X,X,X,4,240
200 PORT command successful. Consider using PASV.
---> STOR TF_123.CAM555.abc
150 Ok to send data.
226 File receive OK.
ftp> put C:\directory\source_dir\"TF_directory1"
**Error opening local file C:\directory\source_dir\TF_directory1.**
ftp> quit
---> QUIT
221 Goodbye.

脚本:

set base_dir=C:\directory\
set log_dir=%base_dir%source_dir\
set log_file=%base_dir%log_file.txt

::Function to check if the ftpinfo exists. If not, create it.
:createFTPinfoFile
echo ########################## entering function :createFTPinfoFile
if not exist %base_dir%ftpinfo.dat (
    echo %timestamp% -- Creating ftpinfo.dat file at location %base_dir% >> %log_file%
    echo user USERNAME> %base_dir%ftpinfo.dat
    echo PASSWORD>> %base_dir%ftpinfo.dat
    echo %timestamp% -- Created ftpinfo.dat >> %log_file%
) ELSE (
    echo %timestamp% -- %base_dir%ftpinfo.dat was not properly removed - Removing the file >> %log_file%
    del %base_dir%ftpinfo.dat
    echo %timestamp% -- Creating ftpinfo.dat file at location %base_dir% >> %log_file%
    echo user USERNAME> %base_dir%ftpinfo.dat
    echo PASSWORD >> %base_dir%ftpinfo.dat
    echo %timestamp% -- Created ftpinfo.dat >> %log_file%
)
echo ############################ finished :createFTPinfoFile
EXIT /B 0

:addFilesToFTPinfo 
echo ############################ entering function :addFilesToFTPinfo
set num=0
echo %timestamp% -- Starting to add files from %log_dir% to ftpinfo.dat >> %log_file%
for /f "delims=" %%i in ('forfiles /p %log_dir% /m "TF_*.CAM*.*" /d -0 -c "cmd /c echo put %log_dir%@file >> %base_dir%ftpinfo.dat & echo 1" ^| find /c /v ""') do set /a num=%%i-1
echo %timestamp% -- Starting to add folders from %log_dir% to fptinfo.dat >> %log_file%
for /f "delims=" %%i in ('forfiles /p %log_dir% /m "TF_*" /d -0 /c "cmd /c if @isdir==TRUE echo put %log_dir%@file >> %base_dir%ftpinfo.dat & echo 1" ^| find /c /v ""') do set /a num=%num%+%%i-1
echo %timestamp% -- added everything to ftpinfo.dat >> %log_file%
echo ############################ finished :addFilesToFTPinfo
EXIT /B 0

REM::This function creates the connection to the ftp server using the information from ftpinfo.dat
:ftpUploadFiles
echo ########################## entering function :ftpUploadFiles
if exist %base_dir%ftpinfo.dat (
    echo cd new_files >> %base_dir%ftpinfo.dat
    CALL :addFilesToFTPinfo
    echo quit >> %base_dir%ftpinfo.dat
    echo %timestamp% -- Connecting to FTP server to upload files >> %log_file%
    ftp -n -s:%base_dir%ftpinfo.dat ftpserver.domain.com
)
echo ########################## finished :ftpUploadFiles
EXIT /B 0

有人知道更好的方法吗?

【问题讨论】:

    标签: windows batch-file ftp


    【解决方案1】:

    Windows 命令行ftp.exe 客户端不支持递归操作。

    如果你想转移文件夹,你有三个选择:

    1. 在批处理文件中做所有艰苦的工作,为所有文件和文件夹生成ftp上传命令。虽然可行,但实施起来相当困难。
    2. 为您的特定文件夹使用临时解决方案,如 @SamDenty 的回答所示。
    3. 最简单的方法是使用第 3 方命令行 FTP 客户端。大多数第 3 方 FTP 客户端都支持递归操作。

    例如WinSCP FTP client,您可以使用如下脚本:

    open ftp://username:password@ftp.example.com/
    put TF_directory1
    put TF_123.CAM555.abc
    put TF_123.CAM123.zyx
    put TF_987.CAM555.abc
    exit
    

    然后从批处理文件中运行脚本 (ftp.txt),例如:

    winscp.com /script=ftp.txt
    

    请参阅guide for converting Windows FTP script to WinSCP script

    (我是 WinSCP 的作者)

    【讨论】:

      【解决方案2】:

      您正在使用put 传输文件夹,但put 不支持传输文件夹,仅支持以下文件:

      **错误打开本地文件 C:\directory\source_dir\TF_directory1**

      不要使用put,而是尝试使用:

      mkdir TF_directory1
      cd TF_directory1
      mput C:\directory\source_dir\TF_directory1\*
      

      会:

      1. 在名为 TF_directory1 的 FTP 服务器上创建一个目录
      2. 将CD放入目录
      3. TF_directory1复制所有文件并将它们放在新的 FTP 文件夹中



      参考 - Superuser

      【讨论】: