3

RemoveFolderExアプリのアンインストール時に、インストール フォルダーから 1 レベル上のフォルダーを削除しようとしています。ここに私が持っているものがありますが、機能していません:

  <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:: ... }。でいくつかの例を見たので、.NETで${path::combine()}動作すると思いました。getfullpathおそらくそうで、私の構文は間違っていますか?

ありがとうございました!

編集:申し訳ありませんが、その記事が何をしているかを完全に読まずに、ビルド WIX${path::combine...からその内容を入手しました。これは wxs ファイルとは関係なく、NAnt 用です (Rob が後述するように)。だから私の質問は単純にこれだと思います: のような絶対パスと相対パスをどのように組み合わせて解決できますか? ありがとうC:\Program files (X86)\MyApp ID\MyAppLauncher\..\MyApp

EDIT2: ありがとうロブ、私はパスを解決することに集中していたので、単に新しい<Directory要素を参照するという最も明白な解決策さえ考えていませんでした。次のコードで2つのフォルダーをクリーンアップしています。

  <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>
4

1 に答える 1

3

あなたが持っている構文はRegistryValue/@ValueNAnt か何かのように見えます。それを解釈するものは明確ではありませんが、Windows インストーラーは解釈しません。そのレジストリ値を正しく取得するには、いくつかのオプションがあります。まず、RegistryValue要素を次のように変更します。

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

または、ディレクトリ ツリーで「MyApp」を定義し、それを直接参照することもできます。MyAppBaseFolderこれは、次を(peer of INSTALLFOLDER)の子として追加するのと少し似ています。

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

RegistryValue次に、要素を次のように更新します。

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

私は後者を好みますが、それは文字列を連結せずに識別子を使用することを好むからです。

于 2013-04-26T21:02:22.600 に答える