需要将 SSIS 变量传递给执行进程任务,以便为 Winscp 创建动态命令行参数

Need to pass SSIS variable to the Execute Process task to make Dynamic command line argument for Winscp

我在 SFTP 位置有一个文件夹 'DATA',我需要从那里将文件集下载到某个常用位置,然后将相应的文件复制到不同的文件夹位置。

文件名是:

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

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

G:\USER_DATA\USER_USER_SYNC\Download

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

/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

等等...

我正在寻找某种方式,使用它我们可以将所有可用文件下载到一些常见的文件夹位置,然后移动或复制到不同的文件夹位置。

我改变了设计并采用了新的方法。感谢 Martin 修复了 sftp 相关的问题和持续的支持。

新的 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"

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

此步骤将执行 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”

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

其次,如您所见,我正在使用两个执行进程任务将文件从一个位置复制到另一个位置。我们可以做些什么来将这两个命令组合成一个执行进程任务吗?

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