我需要在SSIS包中将文件从一个位置复制到另一个位置。由于该文件夹位于另一个域上,因此在运行robocopy.exe命令之前,我需要模拟另一个帐户。我发现我可以执行“净使用”命令模拟必要的用户帐户,然后立即执行robocopy命令。我没有在Execute Process命令中看到任何直接执行此操作的方法,因此我使用Execute Process任务来运行将这两个命令作为单独行的批处理文件。这种方法的缺点是我无法读取Execute Process命令的结果。所以这引出了三个问题:

  1. 有没有办法在单个执行流程任务中执行多行命令?
  2. 在一行中模拟另一个帐户时,有没有办法执行robocopy.exe?
  3. 有没有办法将批处理文件的结果写回SSIS中的变量或SSIS数据库日志?
  4. 如果上述三个问题中的任何一个都有正面答案,那么我可以根据robocopy命令的结果找出添加工作成功或失败规则的方法。

有帮助吗?

解决方案

如果您已启用扩展存储过程“xp_cmdshell”,则可以轻松实现此目的。 (参见联机丛书中的“表面区域配置”)。

在下面的示例中,我构建了一个包含所有ROBOCOPY选项的.CMD文件,并使用xp_cmdshell将输出抓取到表变量(可以是持久表)来执行此命令文件:

只需使用以下语句将执行T-SQL语句任务添加到SSIS包中:

/** START **/

DECLARE @cmdfile nvarchar(255) = N'C:\myFolder\myCommandFile.cmd'
DECLARE @logtable table (
    [RowId] integer IDENTITY(1,1) NOT NULL
    ,[Message] nvarchar(1024) NULL
)

INSERT INTO @logtable ([Message])
EXEC xp_cmdshell @cmdfile

SELECT *
FROM @logtable
WHERE
[Message] IS NOT NULL

/** END **/

根据为ROBOCOPY命令设置的日志记录选项,您可以显示进度,标题,报告或更多内容。有关这些选项,请参阅ROBOCOPY文档。如果要从ROBOCOPY命令中获取任何控制台输出,请尝试使用/ TEE开关。

其他提示

我能想到这样做的一种方法是使用 RUNAS 执行批处理命令(这样你可以执行多个行项目)(模仿另一个用户帐户)

您可以在日志文件中捕获批处理文件的输出,并使用脚本将其内容读入SSIS。

我不确定如何写入SSIS日志,并且有兴趣了解其他开发人员对此有何看法。

我找到了两种循环方法,用于将批处理文件执行中的数据导入数据库。一种方法是将日志记录添加到实际批处理文件中。我还没有尝试过,但它在概念上似乎是可能的。我尝试过的另一个选项是将批处理文件执行作为SQL Server代理作业步骤并添加平面文件日志记录。在我这样做之后,我创建了一个小包,用于搜索特定消息的文件。我仍然更喜欢更好的解决方案,但现在这种方法效果还不错。

  

有没有办法在单个Execute中执行多行命令   处理任务?

是的,使用“Cmd.exe”可执行的 使用以下表达式(示例)创建 string 变量:

*"/C \"start robocopy c:\\temp\\v10.2a c:\\temp\\v1 *.WRI /Z /S && start robocopy c:\\temp\\v10.2a c:\\temp\\v1 *.dll /Z /S\""*

然后通过组件表达式映射到arguments参数。然后你可以在//

中执行这两个(或更多)robocopy
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top