Robocopy, многострочная задача выполнения процесса SSIS или вывод результатов пакетного файла в SSIS - PullRequest
0 голосов
/ 26 октября 2009

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

  1. Есть ли способ выполнить многострочную команду в одной задаче «Выполнение процесса»?
  2. Есть ли способ выполнить robocopy.exe при олицетворении другой учетной записи в одной строке?
  3. Есть ли способ записать результаты пакетного файла обратно в переменную в SSIS или в журнал базы данных SSIS?

Если на любой из трех приведенных выше вопросов есть положительный ответ, то я могу найти способ добавить правила успеха или неудачи работы на основе результатов команды robocopy.

Ответы [ 4 ]

2 голосов
/ 05 октября 2010

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

В следующем примере я создаю файл .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.

0 голосов
/ 08 февраля 2013

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

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

0 голосов
/ 01 ноября 2009

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

0 голосов
/ 26 октября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...