简体   繁体   English

Windows批量上传目录和文件到FTP

[英]Upload directory and files to FTP in Windows batch

I'm writing a batch script for a Windows 7 machine.我正在为 Windows 7 机器编写批处理脚本。 The goal of the script is to move files from the directory C:\\directory\\source_dir\\ to an ftp server ftpserver.domain.com .该脚本的目标是将文件从目录C:\\directory\\source_dir\\到 ftp 服务器ftpserver.domain.com

Not all the files should be uploaded to the ftp server, so I'm using regular expression.并非所有文件都应该上传到 ftp 服务器,所以我使用了正则表达式。

File Structure:文件结构:

C:\\directory\\source_dir\\TF_directory1 C:\\directory\\source_dir\\TF_directory1
C:\\directory\\source_dir\\TF_directory1\\file1.txt C:\\directory\\source_dir\\TF_directory1\\file1.txt
C:\\directory\\source_dir\\TF_directory1\\file2.txt C:\\directory\\source_dir\\TF_directory1\\file2.txt
C:\\directory\\source_dir\\TF_directory1\\sub_dir\\file_A.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\\Ignore_directory\\not_important.txt
C:\\directory\\source_dir\\TF_123.CAM555.abc C:\\directory\\source_dir\\TF_123.CAM555.abc
C:\\directory\\source_dir\\TF_123.CAM123.zyx C:\\directory\\source_dir\\TF_123.CAM123.zyx
C:\\directory\\source_dir\\TF_987.CAM555.abc C:\\directory\\source_dir\\TF_987.CAM555.abc
C:\\directory\\source_dir\\wrong_file.txt C:\\directory\\source_dir\\wrong_file.txt

From the above structure TF_directory1 and everything inside should be uploaded.从上面的结构TF_directory1和里面的所有东西都应该上传。 As should the files TF_123.CAM555.abc , TF_123.CAM123.zyx and TF_987.CAM555.abc .文件TF_123.CAM555.abcTF_123.CAM123.zyxTF_987.CAM555.abc应该TF_987.CAM555.abc

Here's my problem:这是我的问题:

The ftp put command returns an error on the directory 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.

Script:脚本:

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

Does anyone know a better way to do this?有谁知道更好的方法来做到这一点?

The Windows command-line ftp.exe client does not support recursive operations. Windows 命令行ftp.exe客户端不支持递归操作。

If you want to transfer folders, you have three options:如果要传输文件夹,您有三个选择:

  1. Do all the hard work in the batch file, generating ftp upload commands for all files and folders.在批处理文件中完成所有艰苦的工作,为所有文件和文件夹生成ftp上传命令。 While doeable, this is pretty difficult to implement.虽然可行,但这很难实现。
  2. Use an ad-hoc solution for your specific folder(s), like the answer by @SamDenty shows.为您的特定文件夹使用临时解决方案,如@SamDenty 所示的答案。
  3. Easiest is to use a 3rd party command-line FTP client.最简单的方法是使用第 3 方命令行 FTP 客户端。 Most 3rd party FTP clients do support recursive operations.大多数 3rd 方 FTP 客户端都支持递归操作。

For example with WinSCP FTP client , you can use a script like:例如,对于WinSCP FTP 客户端,您可以使用如下脚本:

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

And run the script ( ftp.txt ) from a batch file like:并从批处理文件中运行脚本( ftp.txt ),例如:

winscp.com /script=ftp.txt

See the guide for converting Windows FTP script to WinSCP script .请参阅将 Windows FTP 脚本转换为 WinSCP 脚本的指南

(I'm the author of WinSCP) (我是 WinSCP 的作者)

You are using put to transfer a folder, but put doesn't support transferring folders, only files as stated by:您正在使用put传输文件夹,但put不支持传输文件夹,仅支持如下所述的文件:

**Error opening local file C:\\directory\\source_dir\\TF_directory1** **打开本地文件C:\\directory\\source_dir\\TF_directory1 时出错**

Instead of using put , try using:不要使用put ,请尝试使用:

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

Which would:这将:

  1. Make a directory on the FTP server named TF_directory1在 FTP 服务器上创建一个名为TF_directory1的目录
  2. CD into the directory光盘进入目录
  3. Copy all files from the TF_directory1 and place them in the new FTP folderTF_directory1复制所有文件并将它们放在新的 FTP 文件夹中



Reference - Superuser参考 - 超级用户

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM