将下载的文件移动并重命名为WinSCP脚本中的另一个目录

时间:2016-08-19 11:10:09

标签: batch-file 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

1 个答案:

答案 0 :(得分:0)

  • %TIMESTAMP#yyyymmss% is a feature of WinSCP,您不能直接在Windows批处理文件中使用它。虽然您可以从批处理文件中运行winscp.com来格式化时间戳。请参阅下面的代码和WinSCP示例Formatting Timestamp in Batch File

  • 您正在将三个文件下载到一个本地名称(modules_flat_file_footer.csv)。所以你实际上失去了其中两个。

您可以使用这样的批处理文件:

@echo off

set SESSION=ftp://username:password@ftp.example.com/
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