用于在SSIS下使用WinSCP调度SFTP的SQL Server代理

时间:2015-09-29 21:03:18

标签: batch-file ssis sftp winscp sql-server-agent

我有一个批处理脚本,它生成一个WinSCP上传脚本,用于将文件上传到SFTP位置。现在,当我通过命令提示符运行批处理文件时 - 它成功运行并加载它。我通过SSIS执行进程调用相同的任务 - 它成功运行并加载它。现在当我在SQL Agent上添加相同内容时 - 我尝试了以下两个选项:

  1. 使用操作系统(CmdExec) - cmd.exe / c" \ .bat"
  2. 将SSIS包添加到SSISDB并将其添加为作业步骤。
  3. 通过以上两个选项,作业显示成功运行。但是文件没有上传!关于发生了什么的任何想法?

    这是我的批处理脚本:

    echo off
    SET winscp=C:\"Program Files (x86)"\WinSCP\WinSCP.com
    SET stagingDirectory=\\<staging path>\
    SET scriptPath=\\<ScriptPath>\UploadScript.txt
    SET ftpHost=xx.xx.xx.xx
    SET ftpUser=user
    SET ftpPass=password
    SET fileName=Test.xlsx
    SET ftpFlags=
    @REM ftpFlags: -explicit
    
    echo deleting uploadScript if it already exists
    
    IF EXIST %scriptPath% del /F %scriptPath%
    IF EXIST %scriptPath% exit 1
    
    echo Generating WINSCP Upload Script
    
    >>%scriptPath% echo option batch abort
    >>%scriptPath% echo option confirm off
    >>%scriptPath% echo open sftp://%ftpUser%:%ftpPass%@%ftpHost% %ftpFlags%
    >>%scriptPath% echo option transfer binary
    >>%scriptPath% echo put %stagingDirectory%%fileName% /
    >>%scriptPath% echo close
    >>%scriptPath% echo exit
    
    echo Launching WINSCP upload
    
    start /wait %winscp% /console /script=%scriptPath%
    

2 个答案:

答案 0 :(得分:0)

您的变量似乎设置不正确。要使用路径中的空格和变量进行管理,您必须将整个路径或整个变量放在引号中。

set "winscp=C:\Program Files (x86)\WinSCP\WinSCP.com"
echo start "%winscp%"
:: output: start "C:\Program Files (x86)\WinSCP\WinSCP.com"

set winscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
echo start %winscp%
:: output: start "C:\Program Files (x86)\WinSCP\WinSCP.com"

另一点,您必须检查此文件:UploadScript.txt,因为您的脚本会添加新行而不是重新生成文件。

将此行更改为>%scriptPath% echo option batch abort而不是>>%...

啊,我没注意IF EXIST

答案 1 :(得分:0)

当您通过start(为什么?)启动WinSCP时,退出代码不会传播到SSIS。所以,如果脚本失败,你永远不会学习。它很可能会失败。

您还应启用日志记录,以便查看错误。

您应该使用此代码将WinSCP退出代码传播到SSIS并启用日志记录:

%winscp% /log=\\<ScriptPath>\UploadScript.log /script=%scriptPath%
exit /b %ERRORLEVEL%

(请注意,winscp.com没有/console parameter

无论如何,一个明显的问题是你没有指定expected SSH host key in the script。手动运行脚本时,可能已将密钥缓存在Windows帐户的注册表中。但是在SSIS下使用了一个不同的帐户,其主机密钥缓存可能是空的。您应该在脚本中添加-hostkey switch to the open command以使脚本独立于缓存。见Where do I get SSH host key fingerprint to authorize the server?

测试脚本时,将/ini=nul参数添加到isolate the script from your configuration

对于此提示和其他提示,在调试在SSIS下运行的WinSCP时,请参阅My script works fine when executed manually, but fails or hangs when run by Windows Scheduler, SSIS or other automation service. What am I doing wrong?

最后,请参阅WinSCP SFTP Task for SSIS