어쨌든 msiexec가 파일에 로깅하는 대신 stdout에 반향되게해야합니까?


8

지속적인 전달 파이프 라인의 일부로 주어진 시스템에 msi를 설치하고 싶습니다. msiexec plus psexec는이 작업을 완벽하게 수행하지만 msiexec는 파일에만 로그 할 수 있으며 stdout / stderr에 로그해야합니다.

현재 CI 소프트웨어로 출력을 다시 가져 오려면 로그 내용을 에코하는 두 번째 단계를 추가해야합니다.

아무도 전에이 문제에 직면 했습니까 (그리고 극복 했습니까?)

여기에 도움을 주셔서 감사합니다.


msiexec의 내장 파일 로깅을 사용하고 디스크에서 다시 읽습니다. 설치하는 동안 몇 가지 msiexec.exe 프로세스를 시작할 수 있으며, 모든 프로세스의 출력을 리디렉션해야 할 것 같습니다. 다른 보안 컨텍스트에서 실행되고 사용자 지정 작업을 실행하기 위해 자동으로 생성 된 msiexec.exe 프로세스가 표시 될 수 있습니다. 내가 다루고 싶은 벌레의 깡통.
Stein Åsmul

답변:


5

나는 이것을 다시 확인했고, 여기에 업데이트 된 정보가 있습니다 .

MSI GUI를 억제하고 타사에서 구현 한 외부 GUI를 설정할 수 있습니다. 이 외부 GUI는 설치를 수행 할 때 msiexec.exe 에서 메시지를 수신 할 수 있습니다. 이것은 대부분 사용자 정의 진행률 표시 줄 을 구현하는 것이지만 대부분의 다른 오류 메시지와 상태 메시지를 가로 챌 수 있습니다. MsiSetExternalUI function .

흥미로운 매개 변수는 dwMessageFilter 입니다. 이를 설정하면 예를 들어 설치 중 발생하는 오류 메시지 만 수신 할 수 있습니다. 이것이 대부분의 목적에 충분하다고 생각합니다.

INSTALLUI_HANDLER MsiSetExternalUI(
  _In_  INSTALLUI_HANDLER puiHandler,
  _In_  DWORD dwMessageFilter,
  _In_  LPVOID pvContext
);

유감스럽게도 현재이 샘플 코드가 없습니다. 시스템을 올바르게 설정하면 나중에 테스트하겠습니다. MsiEnableLog 기능은 파일에 로깅을 사용하도록 설정하는 관련 함수 호출이다. 업데이트 : 다음은 작동하는 SDK 예제 입니다.

상기 명령 줄 인터페이스 수준 , 당신은 또한을 추가하여 파일을 즉시 버퍼를 플러시 로깅을 설정할 수 있습니다 ! 매개 변수 :

msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log" 

즉, msiexec.exe가 충돌해도 로그 파일이 손실되지 않으므로 로그 버퍼가 손실되지 않습니다. IO 오버 헤드로 인해 설치 비용이 상당히 느려집니다.


3

MsiExec 파일에만 로그 할 수 있으므로 설치 프로그램이 완료된 후 해당 파일의 내용을 계속 반향해야합니다.


1

오히려 로컬 시스템의 MSI 로그 파일을 각 설치의 공통 위치에 영구적으로 캐시 한 다음 전체 설정의 종료 코드를 등록하면됩니다. 설치가 성공을보고하면 로그 파일이 흥미롭지 않습니까? 더 "잡음"?

이외에도 MSI 설치에 대한 로그 정보를 캡처하여 중앙에 저장하는 여러 소프트웨어 전달 시스템이 있습니다. 한 가지 예는 SCCM (Microsoft의 이름이 Systems Management Server-SMS)입니다.

모든 MSI 파일에 대한 로깅 설정은 "시스템의 모든 설정에 대한 전역"섹션을 참조하십시오. http://www.installsite.org/pages/en/msifaq/a/1022.htm


0

다음 powershell 스크립트를 사용합니다. 여전히 로그를 파일에 기록해야하지만 내용을 stdout에 실시간으로 기록합니다.

$main_process = Start-Process -FilePath ".\installer.exe" -ArgumentList "/S /V`"/qn /l*! output.log`"" -NoNewWindow -PassThru
$log_process = Start-Process "powershell" "Get-Content -Path output.log -Wait" -NoNewWindow -PassThru
$main_process.WaitForExit()
$log_process.Kill()
exit $main_process.ExitCode
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.