【问题标题】:Robocopy, Multi-Line Execute Process SSIS Task, or Output Batch File Results to SSISRobocopy、多行执行进程 SSIS 任务或将批处理文件结果输出到 SSIS
【发布时间】:2010-12-10 05:11:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: ssis batch-file robocopy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这是一个替代网络使用的好主意。我会看看是否可以将 runas 与 robocopy.exe 组合成一行。如果它必须作为单独的命令行执行,那么 net use 已经足够我的目的了。
      • runas 命令没有密码参数。相反,它会提示您输入密码。针对该问题的谷歌搜索解决方案提出了使用网络使用作为替代方案或从其他来源回显密码。我不认为这是解决问题的一步。 :( 我也不想像其他一些 runas 密码问题解决方案所建议的那样,对另一个使用密码执行 runas 的程序建立依赖关系。
      【解决方案3】:

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

      【讨论】:

      • 克劳斯有一个更好的解决方案。 :)
      【解决方案4】:

      有没有办法在单个 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多