Robocopy, tâche SSIS du processus d'exécution multiligne ou sortie des résultats du fichier de commandes dans SSIS

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

  •  06-07-2019
  •  | 
  •  

Question

Je dois copier des fichiers d’un emplacement à un autre dans un package SSIS. Étant donné que le dossier se trouve sur un autre domaine, je dois emprunter l'identité d'un autre compte avant d'exécuter la commande robocopy.exe. J'ai découvert que je pouvais exécuter une "utilisation nette". commande pour emprunter l'identité du compte d'utilisateur nécessaire, puis exécuter la commande robocopy immédiatement après. Je ne vois aucun moyen de faire cela dans une commande d'exécution de processus pour le faire directement. J'utilise donc une tâche d'exécution de processus pour exécuter un fichier de commandes contenant ces deux commandes en tant que lignes séparées. L'inconvénient de cette approche est que je ne peux pas lire les résultats de la commande Execute Process. Cela m’amène donc à trois questions:

  1. Existe-t-il un moyen d'exécuter une commande multiligne dans une tâche d'exécution unique?
  2. Existe-t-il un moyen d'exécuter robocopy.exe en empruntant l'identité d'un autre compte sur une ligne?
  3. Est-il possible d'écrire les résultats d'un fichier de commandes dans une variable de SSIS ou dans le journal de la base de données SSIS?

S'il existe une réponse positive à l'une des trois questions ci-dessus, je pourrai peut-être trouver un moyen d'ajouter des règles de réussite ou d'échec de travail basées sur les résultats de la commande robocopy.

Était-ce utile?

La solution

Cela peut être facilement réalisé si vous avez activé l'utilisation de la procédure stockée étendue "xp_cmdshell "". (voir la documentation en ligne pour "Configuration de la surface d'exposition").

Dans l'exemple suivant, j'ai construit un fichier .CMD contenant toutes les options de mon ROBOCOPY et l'exécute simplement en utilisant xp_cmdshell en récupérant la sortie dans une variable de table (peut être une table persistante à la place):

Ajoutez simplement une tâche d’instruction Execute T-SQL à votre package SSIS à l’aide de l’instruction suivante:

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

En fonction des options de journalisation définies pour la commande ROBOCOPY, vous pouvez afficher la progression, les en-têtes, les rapports, etc. Voir la documentation de ROBOCOPY pour ces options. Essayez également d’utiliser le commutateur / TEE si vous voulez récupérer une sortie de console à partir de la commande ROBOCOPY.

Autres conseils

Pour ce faire, exécutez une commande batch (vous pouvez ainsi exécuter plusieurs postes individuels) avec RUNAS (pour emprunter l'identité d'un autre compte d'utilisateur)

.

Vous pouvez capturer la sortie du fichier de commandes dans un fichier journal et en lire le contenu dans SSIS à l'aide du script.

Je ne sais pas comment écrire dans le journal SSIS et je suis intéressé de voir ce que les autres développeurs ont à dire à ce sujet.

J'ai trouvé deux méthodes de contournement pour obtenir les données d'une exécution de fichier batch dans la base de données. Une méthode consiste à ajouter la journalisation au fichier de commandes réel. Je n'ai pas encore essayé, mais cela semble conceptuellement possible. L’autre option que j’ai essayée et qui a fonctionné consiste à exécuter le fichier de commandes en tant qu’étape de travail de l’agent SQL Server et à ajouter une journalisation à fichier plat. Après cela, j'ai créé un petit package qui récupère le fichier pour des messages spécifiques. Je préférerais quand même une meilleure solution, mais cela fonctionne assez bien pour l'instant.

  

Existe-t-il un moyen d'exécuter une commande multiligne en une seule exécution   Tâche de processus?

Oui, utilisez "Cmd.exe". comme exécutable Créez une variable string avec l'expression suivante (exemple):

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

Et mappez ensuite le paramètre arguments via l'expression du composant. Ensuite, vous pouvez exécuter ces deux (ou plus) robocopy dans //

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top