Batch file 用于在SSIS下使用WinSCP调度SFTP的SQL Server代理
我有一个批处理脚本,它生成一个WinSCP上载脚本,用于将文件上载到SFTP位置。现在,当我通过命令提示符运行批处理文件时,它将成功运行并加载。我通过SSIS Execute process task调用了相同的任务-它成功运行并加载。现在,当我在SQL Agent上使用相同的选项时,我尝试了以下两个选项: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,并将其作为作业步骤添加 使用上述两个选项,作业显示成功运行。但是文件没有上传!对正在发生的事情
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%