Robocopy, Multi-Line Execute Process SSIS Task 또는 SSIS에 출력 배치 파일 결과

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

  •  06-07-2019
  •  | 
  •  

문제

SSIS 패키지의 한 위치에서 다른 위치로 파일을 Robocopy해야합니다. 폴더가 다른 도메인에 있으므로 robocopy.exe 명령을 실행하기 전에 다른 계정을 가장해야합니다. 필요한 사용자 계정을 가장하는 "Net Use"명령을 실행 한 다음 즉시 RoboCopy 명령을 실행할 수 있습니다. Execute Process 명령 에서이 작업을 수행하기 위해이 작업을 수행하는 방법이 없으므로 Execute Process 작업을 사용 하여이 두 명령을 별도의 줄로 실행하는 배치 파일을 실행합니다. 이 접근법의 단점은 Execute Process 명령의 결과를 읽을 수 없다는 것입니다. 그래서 이것은 세 가지 질문으로 이어집니다.

  1. 단일 실행 프로세스 작업에서 멀티 라인 명령을 실행하는 방법이 있습니까?
  2. 한 줄로 다른 계정을 가장하면서 robocopy.exe를 실행하는 방법이 있습니까?
  3. 배치 파일의 결과를 SSIS의 변수 또는 SSIS 데이터베이스 로그에 다시 작성하는 방법이 있습니까?

위의 세 가지 질문 중 하나에 대한 긍정적 인 답이 있다면 Robocopy 명령의 결과를 기반으로 직무 성공 또는 실패 규칙을 추가하는 방법을 찾을 수 있습니다.

도움이 되었습니까?

해결책

확장 된 저장된 절차 "XP_CMDSHELL"을 사용할 수있게 된 경우 쉽게 달성 할 수 있습니다 ( "표면적 구성"은 온라인에서 책을 참조하십시오).

다음 샘플에서 모든 robocopy 옵션이 포함 된 .CMD 파일을 빌드하고 XP_CMDSHELL을 사용 하여이 명령 파일을 실행합니다. 출력을 테이블 변수로 잡습니다 (대신 지속적인 테이블이 될 수 있음).

다음 명령문과 함께 SSIS 패키지에 t-sql 문을 실행하기 만하면됩니다.

/** 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 문서를 참조하십시오. 또한 Robocopy 명령에서 콘솔 출력을 잡으려면 /Tee 스위치를 사용해보십시오.

다른 팁

이 작업을 수행 할 수있는 한 가지 방법은 배치 명령을 실행하는 것입니다 (따라서 여러 줄 항목을 실행할 수 있음) RUNAS (다른 사용자 계정을 가장하려면)

로그 파일에서 배치 파일의 출력을 캡처하고 스크립트를 사용하여 그 내용을 SSI로 읽을 수 있습니다.

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

그런 다음 구성 요소 표현식을 통해 인수 매개 변수에 매핑하십시오. 그런 다음 // 두 가지 (또는 그 이상) Robocopy를 실행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top