我创建了以下文件来执行指定的特定任务:
DataCollection.bat
- 打开WinSCP并在dailyimport.txt
Dailyimport.txt
- 登录远程FTP站点并检索三个*.csv
文件,并将其重命名为目标文件夹。稍后执行PHP脚本以将三个CSV文件中的数据导入我的数据库。
我现在需要做的是,我遇到问题的地方是:
请参阅我在下面的代码:
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 :(得分: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中,您还可以枚举实际下载的文件列表,因此您确定只移动已下载的文件。这可以保护您免受下载和移动之间新文件添加到远程文件夹的情况(事务安全性)。