[英]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.abc
、 TF_123.CAM123.zyx
和TF_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:如果要传输文件夹,您有三个选择:
ftp
upload commands for all files and folders.在批处理文件中完成所有艰苦的工作,为所有文件和文件夹生成ftp
上传命令。 While doeable, this is pretty difficult to implement.虽然可行,但这很难实现。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:这将:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.