使用WinSCP批处理监控SFTP服务器文件新增时if命令报错如何解决
问题原因
你当前编写的是WinSCP专用的SFTP操作脚本,并非标准Windows批处理脚本,WinSCP内置命令中没有if关键词可以直接判断synchronize的执行结果,因此会抛出「未知命令'if'」的报错。
正确实现方案
你需要将逻辑拆分为「WinSCP同步脚本」和「Windows批处理调度脚本」两部分,通过批处理捕获同步结果后执行后续通知逻辑:
- 第一步:新建WinSCP同步脚本
winscp_sync.txt,写入纯同步逻辑即可:
option batch on option confirm off open sftp://x@sftp.x/ -privatekey=privateKey.ppk -hostkey="ssh-rsa 2048 x" option transfer binary synchronize local "C:\Users\Administrateur\Desktop\x\x" "/x/x/rx" exit
WinSCP执行该脚本后会返回标准退出码:0代表同步成功无新文件、1代表同步成功有新文件同步到本地、≥2代表同步出错。
- 第二步:新建Windows批处理脚本
monitor_sftp.bat,用于调用WinSCP、判断同步结果、发送邮件通知:
@echo off setlocal :: 按你实际安装路径修改WinSCP程序路径 set WINSCP_PATH="C:\Program Files (x86)\WinSCP\WinSCP.exe" :: 按你的邮箱配置修改以下参数 set SMTP_SERVER=smtp.xxx.com set SMTP_PORT=587 set SMTP_USER=发件人邮箱地址 set SMTP_PASS=发件人邮箱SMTP授权码 set MAIL_TO=收件人邮箱地址 set MAIL_SUBJECT=SFTP服务器新文件通知 set MAIL_BODY=SFTP服务器已有新文件同步到本地目录C:\Users\Administrateur\Desktop\x\x,请查看。 :: 调用WinSCP执行同步 %WINSCP_PATH% /script=winscp_sync.txt /log=winscp_sync.log /loglevel=2 :: 按退出码判断同步结果 if %ERRORLEVEL% equ 1 ( echo 检测到新文件,正在发送通知邮件 :: 调用系统PowerShell发送邮件 powershell -Command "Send-MailMessage -From '%SMTP_USER%' -To '%MAIL_TO%' -Subject '%MAIL_SUBJECT%' -Body '%MAIL_BODY%' -SmtpServer '%SMTP_SERVER%' -Port %SMTP_PORT% -UseSsl -Credential (New-Object System.Management.Automation.PSCredential ('%SMTP_USER%', (ConvertTo-SecureString '%SMTP_PASS%' -AsPlainText -Force)))" ) else if %ERRORLEVEL% equ 0 ( echo 无新文件,脚本退出 ) else ( echo 同步出错,错误码:%ERRORLEVEL%,请查看winscp_sync.log日志排查 ) endlocal exit
- 第三步:配置定时任务
在Windows任务计划程序中新建定时任务,按你需要的监控频率触发执行monitor_sftp.bat即可。
注意事项
- 如果你不需要删除本地比SFTP服务器多余的文件,不要在
synchronize命令后加-delete参数 - 邮箱SMTP参数需要对应你使用的邮箱服务商配置,比如QQ邮箱SMTP服务器为
smtp.qq.com,端口587,授权码需要在邮箱账号设置中开启SMTP服务后获取
内容的提问来源于stack exchange,提问作者Ôokami
相关产品推荐
相关产品推荐

