You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:57:05