如何捕获WinSCP退出码并合并SSIS中的文件复制任务?
针对你的SSIS场景解决方案
问题1:捕获WinSCP退出码并控制后续任务执行
完全可以实现!按以下步骤操作即可:
创建存储退出码的变量
在SSIS包的「变量」面板里新建一个整型变量,比如命名为WinSCPExitCode,将作用域设为整个包。配置WinSCP的Execute Process Task
编辑该任务,切换到「Process」选项卡:- 在「ExitCodeVariable」下拉框中选中刚才创建的
@[User::WinSCPExitCode] - 关键设置:把任务的「FailPackageOnFailure」和「FailParentOnFailure」都改为
False。这样即使WinSCP返回非0退出码(比如你提到的1),任务不会直接标记为失败,而是把退出码存入变量,方便后续判断。
- 在「ExitCodeVariable」下拉框中选中刚才创建的
用优先约束控制后续任务触发
选中WinSCP任务到复制任务之间的箭头(优先约束),右键选择「编辑」:- 把「约束类型」改成Expression and Constraint
- 「约束」选择「Success」(确保WinSCP任务是正常执行完成,而非崩溃终止)
- 在「表达式」中输入:
@[User::WinSCPExitCode] == 0
这样只有当WinSCP成功下载文件(退出码为0)时,后续的复制任务才会启动。
补充:WinSCP的退出码1一般对应一般性错误(比如未找到目标文件、网络连接失败),0代表操作成功,你可以根据实际需求调整表达式的判断逻辑。
问题2:合并多个文件复制步骤到一个Execute Process Task
当然没问题!你只需要把多个copy命令通过CMD的命令串联符合并成一个参数即可,具体做法:
构造合并后的CMD参数
用&(不管前一个命令是否成功都执行后续命令)或者&&(前一个命令成功才执行后一个)连接多个copy命令,再用双引号包裹整个命令串。针对你的场景,示例如下:/C "copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1 & copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing2"如果想更严谨,还可以加上文件存在判断,避免因文件不存在导致复制报错:
/C "if exist G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv (copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1 & copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing2)"配置单个Execute Process Task
新建或修改一个Execute Process Task:- 「Executable」选择
C:\Windows\System32\cmd.exe - 「Arguments」中填入上面构造好的命令参数即可。
- 「Executable」选择
这样一个任务就能完成多文件复制操作,减少包内任务数量,更易维护。
内容的提问来源于stack exchange,提问作者Vikrant Singh Rana
相关产品推荐
相关产品推荐

