2017-02-25 125 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