2016-08-19 31 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

我已经添加了完整的批处理文件解决方案 –