Robocopy, Multi-Line Prozess ausführen SSIS-Task oder Ausgabe Batch File Ergebnisse zu SSIS

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

  •  06-07-2019
  •  | 
  •  

Frage

ich brauche Dateien robocopy von einem Ort zum anderen in einem SSIS-Paket. Da der Ordner auf einer anderen Domäne ist, muss ich ein anderes Konto imitieren, bevor ich den robocopy.exe Befehl ausführen. Ich fand ich kann einen „net use“ Befehl ausführen das notwendige Benutzerkonto zu imitieren und dann unmittelbar danach den Robocopy-Befehl auszuführen. Ich sehe keine Möglichkeit, dies zu tun in einem Process-Befehl ausführen dies direkt zu tun, so dass ich einen Prozess Aufgabe Führen Sie eine Batch-Datei auszuführen, die diese beiden Befehle als separate Linien. Der Nachteil dieses Ansatzes ist, dass ich nicht die Ergebnisse des Prozesses ausführt Befehls lesen kann. Also das führt mich zu drei Fragen:

  1. Gibt es eine Möglichkeit, einen mehrzeiligen Befehl in einer einzigen Prozess ausführen Aufgabe auszuführen?
  2. Gibt es eine Möglichkeit robocopy.exe auszuführen, während ein anderes Konto in einer Zeile Identitätswechsel?
  3. Gibt es eine Möglichkeit, die Ergebnisse einer Batch-Datei zurück zu schreiben, entweder eine Variable in SSIS oder die SSIS-Datenbank anmelden?

Wenn es eine positive Antwort für eine der oben genannten drei Fragen ist, dann kann ich in der Lage sein, einen Weg zu arbeiten, um Job Erfolg oder Misserfolg Regeln auf der Grundlage der Ergebnisse des Robocopy-Befehls hinzufügen.

War es hilfreich?

Lösung

Dies kann leicht achived werden, wenn Sie die Verwendung des Extended Stored Procedure „xp_cmdshell“ aktiviert haben (siehe Online-Dokumentation für „Oberflächenkonfiguration“).

Im folgenden Beispiel baue ich eine CMD-Datei enthält alle meine ROBOCOPY Optionen und einfache führt diesen Befehl Datei mit xp_cmdshell die Ausgabe in eine Tabellenvariable Grabbing (kann eine persistente Tabelle statt sein):

Fügen Sie einfach eine Execute T-SQL-Anweisung Task SSIS-Paket mit der folgenden Aussage:

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

auf den Protokollierungsoptionen für den ROBOCOPY Befehlssatz Je Sie Fortschritt zeigen können, headers, Bericht oder mehr. Siehe die ROBOCOPY Dokumentation für diese Optionen. Versuchen Sie auch die Option / T-Schalter verwenden, wenn alle Konsolenausgabe vom ROBOCOPY Befehl zu greifen.

Andere Tipps

Eine Möglichkeit, die ich denken kann, dies zu tun ist einen Batch-Befehl auszuführen (so können Sie mehrere Positionen ausführen) mit RUNAS (ein anderen Benutzerkonto zum Imitieren)

Sie können die Ausgabe der Batchdatei in einer Protokolldatei erfassen und den Inhalt, dass in SSIS mit dem Script lesen.

Ich bin nicht sicher, wie man das SSIS-Protokoll und bin interessiert zu sehen, was andere Entwickler zu sagen hat, darüber zu schreiben.

fand ich zwei Rund über Methoden zur Daten immer aus einer Batchdatei Ausführung in die Datenbank. Eine Methode ist die Protokollierung der aktuellen Batchdatei hinzuzufügen. Ich habe das noch nicht ausprobiert, aber es scheint, vom Konzept her möglich. Die andere Option Ich habe versucht, die gearbeitet hat, ist die Batchdatei Ausführung als SQL Server Agent Auftrag Schritt zu setzen und Flat-File-Logging hinzuzufügen. Nachdem ich dies tat, habe ich ein kleines Paket, das die Datei für bestimmte Nachrichten schabt. Ich würde immer noch eine bessere Lösung bevorzugen, aber das funktioniert gut genug für jetzt.

  

Gibt es eine Möglichkeit, einen mehrzeiligen Befehl in einem einzigen auszuführen Execute   Prozessaufgabe?

Ja, verwenden Sie "cmd.exe" als ausführbare Erstellen Sie eine string Variable mit folgendem Ausdruck (Beispiel):

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

Und Karte dann auf die Argumente Parameter über die Komponente Ausdruck. Dann können Sie diese beiden (oder mehr) Robocopy in // ausführen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top