Robocopy, Multi-Line Execute Process SSIS tarefa ou lote de saída arquivo de resultados para SSIS

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu preciso arquivos Robocopy de um local para outro em um pacote SSIS. Desde a pasta está em outro domínio, eu preciso passar por outra conta antes de executar o comando Robocopy.exe. Eu descobri que eu pode executar um comando "net use" para representar a conta de usuário necessárias e, em seguida, executar o comando robocopy imediatamente depois. Eu não vejo nenhuma maneira de fazer isso em um comando Executar Processo de fazer isso diretamente, então eu uso uma tarefa Execute Process para executar um arquivo de lote que tem esses dois comandos como linhas separadas. A desvantagem dessa abordagem é que eu não posso ler os resultados do comando Execute Process. Então isso me leva a três perguntas:

  1. Existe uma maneira de executar um comando multi-linha em uma única tarefa Execute Process?
  2. Existe uma maneira de executar Robocopy.exe ao representar outra conta em uma linha?
  3. Existe uma maneira de escrever os resultados de uma volta arquivo de lote para qualquer uma variável no SSIS ou no log de banco de dados SSIS?

Se houver uma resposta positiva para qualquer um dos acima de três perguntas, então eu posso ser capaz de trabalhar para fora uma maneira de adicionar regras de sucesso do trabalho ou fracasso com base nos resultados do comando robocopy.

Foi útil?

Solução

Isto pode ser facilmente achived se você tiver habilitado o uso do "xp_cmdshell" Extended Stored Procedure (veja Books Online para "Surface Area Configuration").

No seguinte exemplo eu tenho construir um arquivo .cmd contendo todas as minhas opções ROBOCOPY e executa simples Este arquivo de comando usando xp_cmdshell pegar a saída para uma variável de tabela (pode ser uma tabela persistente vez):

Basta adicionar um Executar instrução T-SQL de tarefas para o seu pacote SSIS com a seguinte declaração:

/** 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 **/

Dependendo de suas opções de log definidos para o ROBOCOPY comandar você pode mostrar o progresso, cabeçalhos, relatório ou mais. Consulte a documentação ROBOCOPY para essas opções. Também tente usar a opção / T se para agarrar qualquer saída do console do comando ROBOCOPY.

Outras dicas

Uma maneira que eu posso pensar de fazer isso é para executar um comando batch (assim você pode executar vários itens de linha) com RUNAS (se passar por outra conta de usuário)

Você pode capturar a saída do arquivo em lotes em um arquivo de log e ler o conteúdo do que em SSIS usando o Script.

Eu não tenho certeza sobre como escrever para o log do SSIS e estou interessado para ver o que outros desenvolvedores têm a dizer sobre isso.

Eu encontrei dois round-sobre métodos para obter dados de uma execução de arquivos em lotes para o banco de dados. Um método é adicionar o log para o arquivo de lote real. Eu não tentei isso ainda, mas parece conceitualmente possível. A outra opção Tentei que tem funcionado é colocar a execução do arquivo de lote como uma etapa de trabalho do SQL Server Agent e adicionar o registo de arquivo simples. Depois que eu fiz isso, criei um pequeno pacote que raspa o arquivo de mensagens específicas. Eu ainda prefiro uma solução melhor, mas isso funciona bem o suficiente para agora.

Existe uma maneira de executar um comando multi-linha em um único Executar tarefa processo?

Sim, use "Cmd.exe" como executável Criar uma variável string com seguinte expressão (amostra):

*"/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\""*

E, em seguida, mapear para o parâmetro argumentos via expressão componente. Em seguida, você pode executar os dois (ou mais) robocopy em //

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top