0

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

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

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

4

4 回答 4

2

如果您启用了扩展存储过程“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 开关。

于 2010-10-05T08:55:50.460 回答
0

RUNAS我能想到的一种方法是使用(模拟另一个用户帐户)执行批处理命令(因此您可以执行多个行项目)

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

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

于 2009-10-26T17:49:45.433 回答
0

我发现了两种从批处理文件执行中获取数据到数据库的迂回方法。一种方法是将日志记录添加到实际的批处理文件中。我还没有尝试过,但它在概念上似乎是可能的。我尝试过的另一个可行的选项是将批处理文件执行作为 SQL Server 代理作业步骤并添加平面文件日志记录。完成此操作后,我创建了一个小包,用于抓取特定消息的文件。我仍然希望有一个更好的解决方案,但这目前已经足够好了。

于 2009-11-01T18:33:33.613 回答
0

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

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

于 2013-02-08T13:11:11.653 回答