Windows Server 2019中WinSCP批处理命令执行报错的解决咨询
问题修复及优化方案
错误原因解析
- WinSCP命令行工具不支持
copy/xcopy/cp这类系统命令,它有专属的文件传输命令:从SFTP服务器下载到本地用get,本地文件上传到服务器用put。 - 批处理续行符
^使用错误,导致exit被当成Windows系统命令执行,而非WinSCP的内部命令。
修复后的批处理代码
@echo off "C:\Program Files (x86)\WinSCP\WinSCP.com" ^ /log="C:\Users\xxxxxXxxxxxxxx\xxxxxxxx\winscp_log.txt" /ini=nul ^ /command ^ "open sftp://用户名:密码@SFTP服务器地址/ -hostkey=""服务器公钥""" ^ "cd /foldercontainingfiletobecopied" ^ "get -transfer=overwrite /thefolder/thetxttobecopied C:\destinationfolder\" ^ "exit" set WINSCP_RESULT=%ERRORLEVEL% if %WINSCP_RESULT% equ 0 ( echo 下载成功 ) else ( echo 下载失败,错误码:%WINSCP_RESULT% ) exit /b %WINSCP_RESULT%
关键修正点:
- 用
get -transfer=overwrite替代copy:-transfer=overwrite参数强制覆盖本地已存在的文件,满足你“复制替换”的需求。 - 修正续行符:在
/command后添加^,确保后续所有WinSCP命令都被当作/command的参数传递,而非单独的系统命令。 - 日志文件路径建议添加
.txt后缀,方便直接打开查看。
更优实现方式:使用WinSCP脚本文件
把SFTP操作命令单独存为脚本文件,批处理仅负责调用,逻辑更清晰,也更易维护调试:
1. 创建WinSCP脚本文件(例如sftp_download.txt)
open sftp://用户名:密码@SFTP服务器地址/ -hostkey="服务器公钥" cd /foldercontainingfiletobecopied get -transfer=overwrite /thefolder/thetxttobecopied C:\destinationfolder\ exit
2. 调用脚本的批处理文件
@echo off "C:\Program Files (x86)\WinSCP\WinSCP.com" /log="C:\Users\xxxxxXxxxxxxxx\xxxxxxxx\winscp_log.txt" /ini=nul /script="C:\存放脚本的路径\sftp_download.txt" set WINSCP_RESULT=%ERRORLEVEL% if %WINSCP_RESULT% equ 0 ( echo 下载成功 ) else ( echo 下载失败,错误码:%WINSCP_RESULT% ) exit /b %WINSCP_RESULT%
这种方式将操作逻辑与批处理执行逻辑分离,后续修改SFTP操作时无需调整批处理结构,出错时也更容易定位问题。
内容的提问来源于stack exchange,提问作者Alexander Townsend
相关产品推荐
相关产品推荐

