2013-04-26 6 views
3

RemoveFolderEx을 사용하여 앱을 제거 할 때 내 설치 폴더에서 한 수준 위로 폴더를 삭제하려고합니다. 여기에 내가 무엇을 가지고,하지만 작동하지 않습니다 :WiX 3.7의 절대 경로와 상대 경로 결합

<Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="MyAppBaseFolder" Name="MyAppID"> 
      <Directory Id="INSTALLFOLDER" Name="MyAppLauncher"> 
      <Directory Id="UPDATESCRIPTSFOLDER" Name="Scripts" /> 
      <Component Id="CleanupMainApplicationFolder" Guid="*"> 
       <RegistryValue Root="HKLM" Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" Name="Path" Type="string" Value="${path::getfullpath(path::combine([INSTALLFOLDER],'..\MyApp'))}" KeyPath="yes" /> 
       <util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" /> 
      </Component> 
      </Directory> 
     </Directory> 
     </Directory> 
     <Directory Id="ProgramMenuFolder"> 
     <Directory Id="ApplicationProgramsFolder" Name="MyApp ID"/> 
     </Directory> 
    </Directory> 
    </Fragment> 

MSI는 잘 구축 할 것입니다,하지만 난 설치 프로그램을 실행할 때이 RegistryValue 요소에 실패하고 경로에 ".."에 대해 불평 것 같다 . 내가 만들고있는 문자열은 "C:\Program Files (X86)\MyApp ID\MyAppLauncher\..\MyApp"입니다. 내가 해결해야합니다 : "C:\Program Files (X86)\MyApp ID\MyApp".

나는 ${path:: ... }에 익숙하지 않습니다. 내가 ${path::combine()}와 함께 몇 가지 예를 보았으므로 .NET에서 getfullpath과 작동한다고 가정합니다. 어쩌면 내 구문이 잘못된 것일까?

감사합니다.

편집 : 죄송합니다. ${path::combine...BUILDING WIX에서 가져온 것입니다. 해당 기사의 내용을 완전히 읽지 않은 상태입니다. wxs 파일과는 아무런 관련이 없습니다. NAnt입니다 (아래 언급 된 Rob과 같습니다). 그래서 내 질문에 간단하게 : 어떻게 결합하고 C:\Program files (X86)\MyApp ID\MyAppLauncher\..\MyApp 같은 절대 및 상대 경로를 해결할 수 있습니다. 감사합니다

EDIT2 : 다시 한번 감사드립니다. Rob, 나는 새로운 팁을 단순히 언급하는 가장 명백한 해결책조차 생각하지 않은 경로를 해결하는 데 너무 많은 노력을 기울였습니다. <Directory 요소.

<Property Id="APPLICATIONFOLDER"> 
    <RegistrySearch Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="Path" /> 
    </Property> 

    <Property Id="PRINTERFOLDER"> 
    <RegistrySearch Key="SOFTWARE\MyApp ID\MyApp ID Printer" Root="HKLM" Type="raw" Id="PRINTERFOLDER_REGSEARCH" Name="Path" /> 
    </Property> 

...

<Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="MyAppBaseFolder" Name="MyAppID"> 
      <Directory Id="INSTALLFOLDER" Name="MyAppLauncher"> 
      <Directory Id="UPDATESCRIPTSFOLDER" Name="Scripts" /> 
      <Component Id="CleanupMainApplicationFolder" Guid="*"> 
       <RegistryValue Root="HKLM" Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" Name="Path" Type="string" Value="[LM_INSTALLFOLDER]" KeyPath="yes" /> 
       <util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" /> 

       <RegistryValue Root="HKLM" Key="SOFTWARE\MyApp ID\MyApp ID Printer" Name="Path" Type="string" Value="[LMP_INSTALLFOLDER]" /> 
       <util:RemoveFolderEx On="uninstall" Property="PRINTERFOLDER" /> 
      </Component> 
      </Directory> 
      <Directory Id="LM_INSTALLFOLDER" Name="MyApp" > 
      </Directory> 
      <Directory Id="LMP_INSTALLFOLDER" Name="MyAppPrinter" > 
      </Directory> 
     </Directory> 
     </Directory> 
     <Directory Id="ProgramMenuFolder"> 
     <Directory Id="ApplicationProgramsFolder" Name="MyApp ID"/> 
     </Directory> 
    </Directory> 
    </Fragment> 

답변

3

당신이 RegistryValue/@Value에있는 구문은 NAnt 또는 뭔가처럼 보인다 : 나는 이제 다음 코드를 사용하여이 개 폴더를 청소해야합니다. Windows Installer가 해석하지 못한 것은 명확하지 않습니다. 해당 레지스트리 값을 올바르게 가져올 수있는 몇 가지 옵션이 있습니다. 당신이 당신의 디렉토리 트리에 "MyApp를"을 정의 할 수 있습니다, 또는

<RegistryValue Root="HKLM" 
       Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" 
       Name="Path" 
       Type="string" 
       Value="[MyAppBaseFolder]MyApp" 
       KeyPath="yes" /> 

하고 직접 참조 : 첫째, 같이하는 RegistryValue 요소를 변경합니다. 나는 후자를 선호하지만, 그건

<RegistryValue Root="HKLM" 
       Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" 
       Name="Path" 
       Type="string" 
       Value="[MyAppFolder]" 
       KeyPath="yes" /> 

:

<Directory Id='MyAppFolder' Name='MyApp' /> 

은 다음과 같이 당신의 RegistryValue 요소를 업데이트 : 그건 좀 MyAppBaseFolder의 자식으로 ( INSTALLFOLDER의 피어를) 다음을 추가처럼 보일 것 문자열을 연결하지 않고 식별자를 사용하기를 선호하기 때문입니다.

+0

고마워요 (다시) 롭! 나는 당신이 당신의 대답을 쓸 때 나의 포스트를 업데이트하고있었습니다. 실제로 그것은 NAnt입니다. 내 XML에 임의의 코드를 붙이기 전에 기사를 조금 더 자세히 읽어야한다. :) 나는 지금 당신의 제안을 시도 할 것입니다. –