2016-08-19 25 views
1

我創建了以下文件執行特定任務的指示下載的文件重命名爲另一個目錄:搬遷與WinSCP賦予腳本

  • DataCollection.bat - 打開的WinSCP,並在dailyimport.txt
  • Dailyimport.txt運行命令 - 登錄到遠程FTP站點,並檢索三個*.csv文件,並將它們重命名爲目標文件夾。

後來執行一個PHP腳本,將三個CSV文件中的數據導入到我的數據庫中。

我需要什麼,現在做的,在那裏我有一個問題是:

  • 移動下載的文件(現在本地主機上)到一個新的目錄,並再次重命名它們,通過保持文件名稱並添加時間戳。
  • 將FTP服務器上的文件移動到新目錄中。

請看看我的代碼,我有如下:

DataCollection.bat:

@echo off 
winscp.com /script=dailyimport.txt 
if %ERRORLEVEL% neq 0 goto error 

echo Upload succeeded, moving local files 
move "C:\DataImport\modules_flat_file_footer.csv" "C:\DataImport\Imported\modules_flat_file_footer.csv.%TIMESTAMP#yyyymmss%" 
exit /b 0 

:error 
echo Upload failed, keeping local files 
exit /b 1 

dailyimport.txt:

# Connect 
open ftp://myftpdetails/ 
# Change remote directory 
cd /downloads/MySQL 
# Force binary mode transfer 
option transfer binary 
# Download file to the local directory 
get modules_flat_file_footer_*.csv "C:\DataImport\modules_flat_file_footer.csv" 

# Disconnect 
close 
# Exit WinSCP 
exit 

回答

0

您可以使用批處理文件是這樣的:

@echo off 

set SESSION=ftp://username:[email protected]/ 
set REMOTE_PATH=/downloads/MySQL 
set ARCHIVE_PATH=/remote/archive/path 
set LOCAL_PATH=C:\DataImport 
set IMPORTED_PATH=C:\DataImport\Imported 
set MASK=modules_flat_file_footer_*.csv 

winscp.com /ini=nul /log=download.log /command^
    "open %SESSION%"^
    "get %REMOTE_PATH%/%MASK% %LOCAL_PATH%\*"^
    "exit" 

if errorlevel 1 (
    echo Error downloading 
    exit /b 1 
) 

php import.php 

if errorlevel 1 (
    echo Error importing 
    exit /b 1 
) 

for /F "tokens=* USEBACKQ" %%F in (`winscp.com /command "echo %%TIMESTAMP#yyyymmss%%" "exit"`) do (
    set STAMP=%%F 
) 

for %%F in (%LOCAL_PATH%\%MASK%) do (
    move %%F %IMPORTED_PATH%\%%~nxF.%STAMP% 
    if errorlevel 1 (
     echo Error moving %%~nxF 
     exit /b 1 
    ) 

    winscp.com /ini=nul /log=archive_%%~nxF.log /command^
     "open %SESSION%"^
     "mv %REMOTE_PATH%/%%~nxF %ARCHIVE_PATH%/%%~nxF"^
     "exit" 
    if errorlevel 1 (
     echo Error archiving %%~nxF 
     exit /b 1 
    ) 
) 

雖然如此複雜的邏輯,你最好使用PowerShell的,而不是批處理文件。使用WinSCP .NET assembly from the PowerShell script

在PowerShell中,您還可以枚舉實際下載的文件列表,因此您只能確定只移動下載的文件。這可以防止在下載和移動(事務安全)之間新文件被添加到遠程文件夾的情況。

您可以基於這些代碼official examples for the WinSCP .NET assembly

+0

也許一個愚蠢的問題,但如何批處理文件從PowerShell的有什麼不同?還有什麼額外的軟件需要安裝在Windows服務器上?道歉,即一個文件是由於測試,每個文件將有不同的名稱,即頁腳,標題,行。 導入的文件夾用於稍後將導入數據的PHP腳本。一旦導入成功運行,我希望它被移到這裏。 –

+0

我的PHP腳本導入: LOAD DATA LOCAL INFILE 'DataImport // modules_flat_file_line.csv' REPLACE INTO TABLE daily_lines CHARACTER SET處理latin1 FIELDS TERMINATED BY '' 忽略1號線 因此,重命名一旦PHP腳本有運行 –

+0

我已經添加了完整的批處理文件解決方案 –