Робокопия, задача SSIS многострочного выполнения процесса или вывод результатов пакетного файла в SSIS

StackOverflow https://stackoverflow.com/questions/1626176

  •  06-07-2019
  •  | 
  •  

Вопрос

Мне нужно переместить файлы из одного места в другое в пакете служб SSIS. Поскольку папка находится в другом домене, мне нужно выдать себя за другую учетную запись, прежде чем я запусту команду robocopy.exe. Я обнаружил, что могу выполнить «net use» команда для олицетворения необходимой учетной записи пользователя, а затем сразу же после этого выполните команду robocopy. Я не вижу способа сделать это в команде «Выполнить процесс», чтобы сделать это напрямую, поэтому я использую задачу «Выполнить процесс» для запуска пакетного файла, в котором эти две команды представлены в виде отдельных строк. Недостатком этого подхода является то, что я не могу прочитать результаты команды «Выполнить процесс». Итак, это приводит меня к трем вопросам:

<Ол>
  • Есть ли способ выполнить многострочную команду в одной задаче «Выполнение процесса»?
  • Есть ли способ выполнить robocopy.exe при олицетворении другой учетной записи в одной строке?
  • Есть ли способ записать результаты пакетного файла обратно либо в переменную SSIS, либо в журнал базы данных SSIS?
  • Если на любой из трех приведенных выше вопросов будет положительный ответ, я смогу найти способ добавления правил успеха или неудачи работы на основе результатов команды robocopy.

    Это было полезно?

    Решение

    Этого легко достичь, если вы включили использование расширенной хранимой процедуры " xp_cmdshell " (см. Books Online для "Конфигурация поверхности").

    В следующем примере я создаю файл .CMD, содержащий все мои параметры ROBOCOPY, и просто запускаю этот командный файл, используя 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 для этих опций. Также попробуйте использовать переключатель / TEE, если хотите получить любой вывод консоли из команды ROBOCOPY.

    Другие советы

    Один из способов сделать это - выполнить пакетную команду (чтобы вы могли выполнять несколько позиций) с помощью RUNAS (для олицетворения другой учетной записи пользователя)

    Вы можете записать вывод командного файла в файл журнала и прочитать его содержимое в SSIS, используя скрипт.

    Я не уверен, как записывать в журнал служб SSIS, и мне интересно узнать, что другие разработчики могут сказать по этому поводу.

    Я нашел два обходных метода для получения данных от выполнения пакетного файла в базу данных. Одним из методов является добавление регистрации в фактический пакетный файл. Я еще не пробовал, но это кажется концептуально возможным. Другой вариант, который я попытался сработать, состоит в том, чтобы поместить выполнение командного файла в шаг задания агента SQL Server и добавить ведение журнала плоских файлов. После этого я создал небольшой пакет, который очищает файл для определенных сообщений. Я бы все же предпочел лучшее решение, но пока это работает достаточно хорошо.

      

    Есть ли способ выполнить многострочную команду за одно выполнение?   Задача процесса?

    Да, используйте " 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 через выражение компонента. Затем вы можете выполнить эти две (или более) робокопии в //

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top