如何通过WinSCP实现远程文件移至本地或下载后删除远程源文件?
WinSCP脚本修改方案(两种需求实现)
你的两种需求都可以通过WinSCP脚本实现,以下是针对每种需求的修改后的完整脚本:
需求1:将远程路径的文件移动至本地路径
该方案通过get -delete命令实现,文件下载到本地后自动删除远程服务器上的对应文件,等同于“移动”操作:
@echo on cls :SetFileLogVariables SET localdir=C:\Users\User1\Received SET remotedir=\folder_1 SET logfile=C:\Users\Users1\Logs\Syncanddelete.log :SetPrgVariables SET prgwinscp=C:\Users\Users1\AppData\Local\Programs\WinSCP\WinSCP.com SET winscplogin="SyncandDelete" SET winscpfile=%temp%\~tmpWinSCPFTPSyncT_%~N0.txt IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" :SetWinSCPSyncCommand REM 移动远程文件到本地:下载成功后自动删除远程对应文件 SET ftpcmd=get -delete -binary "%remotedir%\*" "%localdir%\" :ftpout >>"%logfile%" ECHO. >>"%logfile%" ECHO *************************** FTP OUT *************************** >>"%logfile%" ECHO 移动远程文件到本地 %winscplogin% 服务器 on %date% at %time% >>"%winscpfile%" ECHO option batch on >>"%winscpfile%" ECHO option confirm off >>"%winscpfile%" ECHO option transfer binary >>"%winscpfile%" ECHO open %winscplogin% >>"%winscpfile%" ECHO cd "%remotedir%" >>"%winscpfile%" ECHO %ftpcmd% >>"%winscpfile%" ECHO close >>"%winscpfile%" ECHO exit >>"%logfile%" ECHO %winscpfile% TYPE "%winscpfile%" >> %logfile% >>"%logfile%" ECHO ------------------------------------------ "%prgwinscp%" /script="%winscpfile%" >>"%logfile%" 2>&1 >>"%logfile%" ECHO ------------------------------------------ IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" >>"%logfile%" ECHO 传输完成 on %date% at %time% ping -n 2 -w 1000 127.0.0.1 > nul
关键修改点:
- 将原
synchronize命令替换为get -delete -binary "%remotedir%\*" "%localdir%\" - 日志中同步操作描述改为“移动远程文件到本地”
需求2:复制远程文件到本地后,仅删除已下载的远程文件
该需求和“移动”的最终效果一致,但如果需要明确先完成复制再删除(不推荐,存在下载失败后误删风险),可以采用分两步执行的方式;更可靠的方式还是使用get -delete(仅在下载成功后删除远程文件)。以下给出两种实现:
方式1:可靠实现(同需求1的脚本)
直接使用get -delete,确保只有下载成功的文件才会被删除,避免数据丢失风险,脚本同需求1。
方式2:分步执行(先复制再删除)
@echo on cls :SetFileLogVariables SET localdir=C:\Users\User1\Received SET remotedir=\folder_1 SET logfile=C:\Users\Users1\Logs\Syncanddelete.log :SetPrgVariables SET prgwinscp=C:\Users\Users1\AppData\Local\Programs\WinSCP\WinSCP.com SET winscplogin="SyncandDelete" SET winscpfile=%temp%\~tmpWinSCPFTPSyncT_%~N0.txt IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" :SetWinSCPSyncCommand REM 先复制远程文件到本地,再删除远程文件 SET ftpcmd_get=get -binary "%remotedir%\*" "%localdir%\" SET ftpcmd_rm=rm "%remotedir%\*" :ftpout >>"%logfile%" ECHO. >>"%logfile%" ECHO *************************** FTP OUT *************************** >>"%logfile%" ECHO 复制并删除远程文件 on %winscplogin% 服务器 on %date% at %time% >>"%winscpfile%" ECHO option batch on >>"%winscpfile%" ECHO option confirm off >>"%winscpfile%" ECHO option transfer binary >>"%winscpfile%" ECHO open %winscplogin% >>"%winscpfile%" ECHO cd "%remotedir%" >>"%winscpfile%" ECHO %ftpcmd_get% >>"%winscpfile%" ECHO %ftpcmd_rm% >>"%winscpfile%" ECHO close >>"%winscpfile%" ECHO exit >>"%logfile%" ECHO %winscpfile% TYPE "%winscpfile%" >> %logfile% >>"%logfile%" ECHO ------------------------------------------ "%prgwinscp%" /script="%winscpfile%" >>"%logfile%" 2>&1 >>"%logfile%" ECHO ------------------------------------------ IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" >>"%logfile%" ECHO 传输完成 on %date% at %time% ping -n 2 -w 1000 127.0.0.1 > nul
注意:分步执行方式存在风险,如果下载过程中出现错误(如网络中断),已经执行的rm命令可能会删除未成功下载的远程文件,因此优先推荐使用方式1。
内容的提问来源于stack exchange,提问作者ecuso
相关产品推荐
相关产品推荐

