需要将SSIS变量传递给Execute Process任务以使Winscp成为动态命令行参数

时间:2019-08-27 13:28:25

标签: ssis sftp winscp

我在SFTP位置有一个文件夹'DATA',我需要从该文件夹将文件集下载到某个公共位置,然后将各个文件复制到其他文件夹位置。

文件名是:

Test1.csv
Test2.csv
Test3.csv
Test4.csv
Test5.csv

我希望首先将文件下载到以下位置:

G:\USER_DATA\USER_USER_SYNC\Download

由于这些文件与不同的架构相关,并且必须由每个不同的sis软件包分别进行处理才能进行进一步的转换和加载。 由于某些原因,我们必须先将其保存在某个公共位置,然后再移动或复制。 这是我的命令行参数。

/log=G:\USER_DATA\USER_USER_SYNC\SFTP_LOG\user_sync_winscp.log /command "open sftp://username:password@stransfer.host.com/" -hostkey=""ssh-rsa 2048 9b:63:5e:c4:26:bb:35:0d:49:e6:74:5e:5a:48:c0:8a""" "get /DATA/Test1.csv G:\USER_DATA\USER_USER_SYNC\Download\" "exit"

上面,我可以一次下载一个给定文件。

自此,我首先需要将其放置在一些常用的文件夹位置。因此,我计划添加另一个执行过程任务来复制文件。

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing2

以此类推...

我正在寻找某种方式,通过这种方式我们可以将所有可用文件下载到某个公用文件夹位置,然后将其移动或复制到其他文件夹位置。

1 个答案:

答案 0 :(得分:1)

我更改了设计并采用了新方法。感谢Martin解决了sftp相关问题并提供了持续的支持。

ssis package 新的SSIS程序包具有以下任务:

第1步。它将在sftp服务器上查找最新更新的文件,并将给定的文件Test1.csvTest2.csv下载到位置G:\USER_DATA\USER_USER_SYNC\Download\

这是我的命令行参数:

/log=G:\USER_DATA\USER_USER_SYNC\SFTP_LOG\user_sync_winscp.log /command "open sftp://bisftp:*UFVy2u6jnJ]#hU0Zer5AjvDU4#K3m@stransfer.host.com/ -hostkey=""ssh-rsa 2048 9b:63:5e:c4:26:bb:35:0d:49:e6:74:5e:5a:48:c0:8a""" "cd /DATA" "get -filemask=">=today" Test1.csv Test2.csv G:\USER_DATA\USER_USER_SYNC\Download\" "exit"

步骤2 。由于我的要求是将每个文件进一步复制到不同的文件夹位置,以便各个进程可以选择相应的文件并开始转换并将其加载到sql server中。

此步骤将执行Window cmd进程,并将Test1.csv复制为新位置

G:\USER_DATA\USER_USER_SYNC\Testing1 

命令行参数为:

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1

同样,我还有另一个执行流程任务,用于将Test2.csv复制到新位置

G:\USER_DATA\USER_USER_SYNC\Testing2

命令行参数为:

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test2.csv G:\USER_DATA\USER_USER_SYNC\Testing2

给定的解决方案工作正常,但是仍然有一些事情需要处理。

由于我仅使用-filemask=">=today".下载最新文件,如果执行流程任务能够在sftp服务器上找到最新文件,则一切运行正常。如果不存在,则下一个后续执行过程任务将失败,并显示以下错误消息。 返回的流程退出代码为“ 1”,而预期的为“ 0”

据我了解,它无法复制或移动,因此已失败。 有什么方法可以捕获从第一次执行流程任务返回的退出代码并将其存储到某个变量中,以便我们可以使用表达式来决定是否启动下一个任务。

第二,如您所见,我正在使用两个执行过程任务来将文件从一个位置复制到另一个位置。我们可以做任何事情将这两个命令组合成一个执行过程任务吗?

任何建议都值得欢迎,而且我认为这个问题需要作为一个单独的问题解决。