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

Batch file 用于在SSIS下使用WinSCP调度SFTP的SQL Server代理,batch-file,ssis,sftp,winscp,sql-server-agent,Batch File,Ssis,Sftp,Winscp,Sql Server Agent,我有一个批处理脚本,它生成一个WinSCP上载脚本,用于将文件上载到SFTP位置。现在,当我通过命令提示符运行批处理文件时,它将成功运行并加载。我通过SSIS Execute process task调用了相同的任务-它成功运行并加载。现在,当我在SQL Agent上使用相同的选项时,我尝试了以下两个选项: 使用操作系统(CmdExec)-cmd.exe/c“\.bat” 将SSIS包添加到SSIDB,并将其作为作业步骤添加 使用上述两个选项,作业显示成功运行。但是文件没有上传!对正在发生的事情

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

  • 使用操作系统(CmdExec)-cmd.exe/c“\.bat”
  • 将SSIS包添加到SSIDB,并将其作为作业步骤添加
  • 使用上述两个选项,作业显示成功运行。但是文件没有上传!对正在发生的事情有什么想法吗

    以下是我的批处理脚本:

    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%
    
    echo关闭
    设置winscp=C:\“程序文件(x86)”\winscp\winscp.com
    设置stagingDirectory=\\\
    设置脚本路径=\\\UploadScript.txt
    设置ftpHost=xx.xx.xx.xx
    设置ftpUser=user
    设置ftpPass=密码
    设置文件名=Test.xlsx
    设置ftpFlags=
    @REM ftpFlags:-显式
    回显删除已存在的上载脚本
    如果存在%scriptPath%del/F%scriptPath%
    如果存在%scriptPath%,请退出1
    echo生成WINSCP上载脚本
    >>%脚本路径%echo选项批处理中止
    >>%脚本路径%echo选项确认关闭
    >>%脚本路径%echo open sftp://%ftpUser%:%ftpPass%@%ftpHost%%ftpFlags%
    >>%脚本路径%echo选项传输二进制文件
    >>%脚本路径%echo put%stagingDirectory%%fileName%/
    >>%脚本路径%echo关闭
    >>%脚本路径%echo退出
    echo启动WINSCP上载
    启动/等待%winscp%/控制台/脚本=%scriptPath%
    
    您的变量似乎设置不正确。要在路径和变量中使用空格进行管理,必须在整个路径或整个变量中加引号

    i、 e

    还有一点,您必须检查这个文件:UploadScript.txt,因为您的脚本添加了新行,而不是重新生成文件

    将此行更改为
    >%scriptPath%echo选项批处理中止
    ,而不是
    >%…


    啊,我没有注意到
    如果存在

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

    i、 e

    还有一点,您必须检查这个文件:UploadScript.txt,因为您的脚本添加了新行,而不是重新生成文件

    将此行更改为
    >%scriptPath%echo选项批处理中止
    ,而不是
    >%…


    啊,我没有注意到
    如果存在

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

    您还应该启用日志记录,以便可以看到问题所在

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

    %winscp% /log=\\<ScriptPath>\UploadScript.log /script=%scriptPath%
    exit /b %ERRORLEVEL%
    
    %winscp%/log=\\\UploadScript.log/script=%scriptPath%
    退出/b%ERRORLEVEL%
    
    (请注意,没有)


    无论如何,一个明显的问题是您没有指定。手动运行脚本时,可能会将该项缓存在Windows帐户的注册表中。但在SSIS下使用的是另一个帐户,其主机密钥缓存可能为空。您应该在脚本中添加,以使脚本独立于缓存。看

    测试脚本时,将
    /ini=nul
    参数添加到


    有关此提示和其他提示,在调试SSIS下运行的WinSCP时,请参阅


    最后,请参阅。

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

    您还应该启用日志记录,以便可以看到问题所在

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

    %winscp% /log=\\<ScriptPath>\UploadScript.log /script=%scriptPath%
    exit /b %ERRORLEVEL%
    
    %winscp%/log=\\\UploadScript.log/script=%scriptPath%
    退出/b%ERRORLEVEL%
    
    (请注意,没有)


    无论如何,一个明显的问题是您没有指定。手动运行脚本时,可能会将该项缓存在Windows帐户的注册表中。但在SSIS下使用的是另一个帐户,其主机密钥缓存可能为空。您应该在脚本中添加,以使脚本独立于缓存。看

    测试脚本时,将
    /ini=nul
    参数添加到


    有关此提示和其他提示,在调试SSIS下运行的WinSCP时,请参阅


    最后,请参阅。

    您是否使用代理帐户执行作业?作业上的日志消息显示它正由某个代理帐户运行。但这会有什么不同吗?SFTP凭据在批处理脚本中进行了硬编码,并且它在noway中链接到我的id。这是我的理解。您是否使用代理帐户执行作业?作业上的日志消息显示它正由某个代理帐户运行。但这会有什么不同吗?SFTP凭据硬编码在批处理脚本中,并且它以noway链接到我的id。这是我的理解。它成功运行,并在我通过命令提示符运行批处理脚本时上载文件。只有当我在SQL server代理上添加它时,它才会失败。当我通过命令提示符运行批处理脚本时,它会成功运行并上载文件。只有当我将它添加到SQL server代理上时,它才会失败。它成功了!我必须将SSH主机密钥添加到脚本中。非常感谢。成功了!我必须将SSH主机密钥添加到脚本中。非常感谢。
    %winscp% /log=\\<ScriptPath>\UploadScript.log /script=%scriptPath%
    exit /b %ERRORLEVEL%