Robocopy,多行执行处理SSIS任务或输出批处理文件结果到SSIS

问题描述:

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

  1. 有没有办法在单个执行进程任务中执行多行命令?
  2. 有没有办法在一行中冒充另一个帐户时执行robocopy.exe?
  3. 有没有办法将批处理文件的结果写回SSIS中的变量或SSIS数据库日志?

如果对上述三个问题中的任何一个都有肯定的答案,那么我可以根据robocopy命令的结果找出一种方法来添加作业成功或失败规则。我能想到这样做的

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

在下面的示例我已经建立使用xp_cmdshell的抓取输出到一个表变量包含我所有ROBOCOPY选项和简单的执行这条命令文件.cmd文件(可以是永久表而不是):

只需添加一个用下面的语句执行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文档。也可以尝试使用/ TEE开关,以获取ROBOCOPY命令的任何控制台输出。

一种方法是执行批处理命令RUNAS(这样你就可以执行多个行项目)(模拟其他用户帐户)

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

我不确定如何写入SSIS日志,并且有兴趣看看其他开发者对此有何评论。

+0

作为网络使用的替代方案,这是一个好主意,我会看看如果我可以用robocopy.exe将runas合并成一行,如果它必须作为单独的命令行执行,那么net use已经足够用于我的目的。 – 2009-10-26 19:03:15

+0

runas命令没有密码的参数,而是提示你输入密码。对于这个问题的谷歌搜索解决方案提出了使用网络使用作为替代或回显密码fr ü其他来源。我不认为这是解决问题的一步。 :(我也不想在另一个程序上建立一个依赖关系,这个程序使用密码执行runas,就像其他一些runas密码问题解决方案中的建议一样。 – 2009-10-26 19:12:55

我发现了两种从批处理文件执行到数据库的循环方法。一种方法是将日志记录添加到实际批处理文件。我还没有尝试过,但在概念上似乎是可能的。我尝试过的另一个选项已经奏效,就是将批处理文件执行作为SQL Server代理作业步骤并添加平面文件日志记录。做完这些之后,我创建了一个小程序包,用于为文件提供特定的消息。我仍然会更喜欢更好的解决方案,但现在这种方法已经足够好了。

+0

克劳斯有一个更好的解决方案。 – 2011-05-27 21:17:10

有没有办法在一个执行 进程任务中执行多行命令?

是的,使用“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\""* 

然后映射到通过组分表达式中的参数参数然后,可以执行在//

这两个(或更多)ROBOCOPY