답변

54

글쎄, 많은 검색과 시행 착오 후 나는 이것을 해결했다. 이것이 최선의 방법인지 확실하지 않지만 작동합니다.

다음 시나리오가 있습니다. Visual Studio 설치 프로젝트를 통해 배포하려는 응용 프로그램이 있습니다. 내 응용 프로그램 파일 외에도 배치 (.bat) 파일이 들어있는 대상 디렉토리에 하위 디렉토리를 만들고 싶습니다. 이 파일을 설치 프로세스가 끝날 때 실행하고 싶습니다. 여기

은 당신이 무엇을 :

  1. 가 설치 프로젝트를 만들고 당신이 일반적으로 당신이 (당신의 배치 파일을 배치거야 그냥 직접하는 경우 해당 응용 프로그램 폴더에 배치 할 수있는 하위 디렉토리를 포함하여, 마찬가지로 구성 당신은 하위 디렉토리에 그것을 원하지 않는다).
  2. 솔루션 탐색기 ->보기 -> 파일 시스템에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 cmd.exe (C : \ Windows \ System32)를 실행할 배치 파일을 추가하십시오. \ cmd.exe)
  3. 솔루션 탐색기 ->보기 -> 사용자 지정 작업에서 프로젝트를 마우스 오른쪽 단추로 클릭하고
  4. "커밋"을 마우스 오른쪽 단추로 클릭하고 "사용자 지정 동작 추가"
  5. cmd.exe로 이동하여 선택하십시오.
  6. 새로 만든 사용자 지정 작업의 속성 패널을 엽니 다.
  7. 인수 속성에서 삭제/커밋.
  8. 는 입력 : 당신은하지 않았다 경우 당신이 하위 디렉토리에 배치 파일을 넣으면 subdirectoryname이 (당신의 하위 디렉토리의 이름으로 대체해야 인수 속성에 /c "[TARGETDIR]subdirectoryname\batchfile.bat" 내가 그랬던 것처럼 ..., 값이되어야한다 /c "[TARGETDIR]batchfile.bat")이며 batchfile.bat는 배치 파일의 파일 이름이어야합니다.

그게 전부입니다. 나머지 설치 프로세스가 완료되면 배치 파일이 실행됩니다.

여기 명확성을 위해 예입니다 :

내 배치 파일 :
blah.bat 내 하위 디렉토리 : 가 mydir

내 사용자 지정 작업은 cmd를 타겟팅 인수의 값. EXE는

/c "[TARGETDIR]mydir\blah.bat"

희망 HEL이 될 것입니다 ps 누군가!

+6

부록으로, 패키지 된 cmd.exe (System32 디렉터리의 cmd.exe와 반대)를 실행하면 유익한 문에서 모든 오류 메시지가 "시스템에서 메시지 번호 0x8에 대한 메시지 텍스트를 찾을 수 없습니다" . 이 문제를 해결하려면 (대상 컴퓨터의 System32에 cmd.exe가 있음을 확실히 알고있는 경우)'/ c cmd.exe/c "TARGETDIR] 하위 디렉터리 이름 \ batchfile.bat"를 사용하십시오. 이렇게하면 패키지 된 cmd.exe가 대상 컴퓨터에서 기본 cmd.exe를 호출하게되어 올바른 오류 메시지가 나타납니다. –

+1

경고 : Windows 10에서 설치 프로그램을 만들고 Windows 7에서 실행하면이 방법이 작동하지 않습니다 !! – Lumo

+0

@ 루모 : 단지 정보 용; 'vbs '옵션은 OS와 독립적으로 작동합니다. – Stefan

0

설치 프로세스 중에 상대 경로가있는 배치 파일을 실행하려고하면 실패하게됩니다. 왜냐하면 배치 파일은 설치 프로그램이 실행되는 디렉토리와 파일이 설치되는 디렉토리를 고려하지 않기 때문입니다. 배치 파일을 임시 디렉토리에 복사하는 설치 빌더를 사용하십시오.

4
  1. VB.NET에서도이 기사를 확인하십시오 (기사는 더 이상 사용되지 않습니다). C#에도 적용됩니다. 가장 중요한 부분은 새 클래스 라이브러리를 만들고 다음 내용이 포함 된 새 Installer 클래스를 추가하는 것입니다 (C#으로 변환 됨). 기사에서 언급했듯이 방금 작성한 프로젝트에 대한 참조로 새 사용자 정의 액션을 만들 수 있습니다.

    override void Commit(IDictionary savedState) 
    { 
        base.Commit(savedState); 
        System.Diagnostics.Process.Start("myApp.bat","your bat arguments"); 
    } 
    
  2. 이제 설치 프로그램 프로젝트에 배치 파일을 추가하고 있습니다. 배치 파일을 배치 할 하위 디렉토리를 포함하여 설치 프로젝트를 만들고 평소대로 구성하십시오 (하위 디렉토리에 배치하지 않으려는 경우 응용 프로그램 폴더에 직접 배치 할 수 있음).

  3. "파일 시스템"보기 (솔루션 탐색기 ->보기 -> 파일 시스템에서 프로젝트를 마우스 오른쪽 단추로 클릭)에서 실행할 배치 파일을 추가하십시오.

  4. 설치 프로그램 프로젝트를 빌드하십시오.

4

동일한 결과에 도달하는 다른 방법 중 하나는 .vbs 파일을 해당 .bat 파일을 실행하는 사용자 지정 작업에 넣는 것입니다. 다음 코드는 설치 응용 프로그램 폴더에 넣은 "RunRegisterComponents.vbs"코드입니다. 물론 Visual Studio 속성 창에서 .vbs 매개 변수로 [TARGETDIR]을 넣었습니다. 나는이 당신을 도울 수 있기를 바랍니다

enter image description here

: 내 사용자 지정 작업을 설정 한 것입니다

dim WshShell 
Set WshShell = CreateObject("WScript.Shell") 

' Read the "CustomActionData" property holding the install directory. 
dim programDir 
programDir= property("CustomActionData") 

' Make the batch full file name and parameter 
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) & 
programDir& chr(34) 

' Set the current directory 
WshShell.CurrentDirectory = programDir 

' Run batch. 
ret = WshShell.Run (commandString, 0, 0) 

!

+0

나는'cmd.exe'에 의존하지 않기 때문에 더 나은 옵션이라고 생각합니다. – Stefan

+0

설치 디렉토리 ('[TARGETDIR]')에'WshShell.CurrentDirectory'를 설정하고 있습니다.''RegisterComponents.bat' 전에'commandString'에'programDir'을 넣을 필요가 있습니까? – Wolf