WinSCP脚本使用if判断FTP文件存在时执行失败的问题咨询
WinSCP脚本不支持批处理
if语句?解决方案看这里 核心问题
WinSCP的原生脚本不支持if、goto、%ERRORLEVEL%这类Windows批处理的控制语法,你写的脚本把WinSCP命令和批处理语法混在一起,导致WinSCP无法识别,执行失败。
两种正确实现方式
方式一:纯WinSCP脚本实现(推荐)
WinSCP自5.12版本起支持原生的if条件语句,也可以用fileexists函数结合get命令实现需求:
写法1:用WinSCP原生if语句
# 自动在错误时终止脚本 option batch abort # 禁用覆盖确认 option confirm off # 连接FTP站点 open FTP # 切换到目标远程文件夹 cd SSISFTP # 判断文件是否存在并执行下载 if fileexists("FILEONE.txt") then get FILEONE.txt else get FILETWO.txt endif # 断开连接并退出 close exit
写法2:用get命令的条件掩码
利用get的-filemask参数实现条件下载,更简洁:
option batch abort option confirm off open FTP cd SSISFTP # 优先下载FILEONE.txt,不存在则下载FILETWO.txt get -filemask=">=FILEONE.txt" FILEONE.txt || get FILETWO.txt close exit
方式二:批处理+WinSCP脚本结合
如果你的WinSCP版本较低,不支持原生if,可以把逻辑拆分到批处理中,通过WinSCP的退出码判断:
- 先创建WinSCP检查脚本(比如命名为
check_file.txt):
option batch abort option confirm off open FTP cd SSISFTP # 检查FILEONE.txt是否存在,存在则返回0,否则返回非0 stat FILEONE.txt exit
- 编写批处理文件(比如
download.bat):
@echo off # 调用检查脚本判断文件是否存在 winscp.com /script=check_file.txt if %ERRORLEVEL% equ 0 ( # 文件存在,下载FILEONE.txt winscp.com /command "open FTP" "cd SSISFTP" "get FILEONE.txt" "close" "exit" ) else ( # 文件不存在,下载FILETWO.txt winscp.com /command "open FTP" "cd SSISFTP" "get FILETWO.txt" "close" "exit" )
原脚本失败原因
你之前写的if %ERRORLEVEL% neq 0 goto error是Windows批处理的语法,但直接放在WinSCP脚本里,WinSCP无法识别批处理的环境变量和控制语句,因此执行报错。
内容的提问来源于stack exchange,提问作者Junsh
相关产品推荐
相关产品推荐

