Робокопия, задача SSIS многострочного выполнения процесса или вывод результатов пакетного файла в SSIS
-
06-07-2019 - |
Вопрос
Мне нужно переместить файлы из одного места в другое в пакете служб SSIS. Поскольку папка находится в другом домене, мне нужно выдать себя за другую учетную запись, прежде чем я запусту команду robocopy.exe. Я обнаружил, что могу выполнить «net use» команда для олицетворения необходимой учетной записи пользователя, а затем сразу же после этого выполните команду robocopy. Я не вижу способа сделать это в команде «Выполнить процесс», чтобы сделать это напрямую, поэтому я использую задачу «Выполнить процесс» для запуска пакетного файла, в котором эти две команды представлены в виде отдельных строк. Недостатком этого подхода является то, что я не могу прочитать результаты команды «Выполнить процесс». Итак, это приводит меня к трем вопросам:
<Ол>Если на любой из трех приведенных выше вопросов будет положительный ответ, я смогу найти способ добавления правил успеха или неудачи работы на основе результатов команды 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 через выражение компонента. Затем вы можете выполнить эти две (или более) робокопии в //