2017-02-25 84 views
1

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

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

文件结构:

C:\目录\ source_dir \ TF_directory1
C:\目录\ source_dir \ TF_directory1 \ FILE1.TXT
C:\目录\ source_dir \ TF_directory1 \ FILE2.TXT
C:\目录\ source_dir \ TF_directory1 \ sub_dir \ file_A.txt
C:\目录\ source_dir \ Ignore_directory \ not_important.txt
C:\目录\ source_dir \ TF_123.CAM555.abc
C:\目录\ source_dir \ TF_123.CAM123.zyx
C:\目录\ source_dir \ TF_987.CAM555.abc
C:\目录\ source_dir \ wrong_file.txt

从上述结构TF_directory1和里面的一切应上载到。文件TF_123.CAM555.abc,TF_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 

有谁知道一个更好的方式来做到这一点?

回答

0

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

如果要传输的文件夹:通过@SamDenty显示

  • 执行批处理文件
  • 使用您的特定文件夹(S)的ad-hoc解决所有的辛勤工作,像答案
  • 使用第三方命令行FTP客户端。大多数其他人都支持递归操作。

例如与WinSCP FTP client,你可以用这样的脚本:

open ftp://username:[email protected]/ 
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的作者)

0

您正在使用put到一个文件夹传输,而是由规定put不支持传输文件夹,只有文件:

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

而不是使用put的,请尝试使用:

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

这将:

  1. 制作名为TF_directory1
  2. CD到目录
  3. 复制所有文件TF_directory1的FTP服务器上的目录,并放置在新的FTP文件夹



参考 - Superuser

相关问题