WIX Installer - скопируйте файлы из места установки в другое место

Я пытаюсь скопировать некоторые файлы из места установки в другую папку во время установки. Когда я устанавливаю SourceDirectory/SourceProperty в жестко запрограммированном месте, установка работает нормально, как ожидалось. Но когда я заменяю SourceDirectory на "INSTALLFOLDER", файлы не копируются во время установки.

Вот полный исходный код,

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="FolderCopySetupProject" Language="1033" 
           Version="1.0.0.0" Manufacturer="Microsoft" 
           UpgradeCode="PUT-GUID-HERE">
    <Package InstallerVersion="200" Compressed="yes" 
             InstallScope="perMachine" />
    <MajorUpgrade DowngradeErrorMessage="Newer version installed." />
    <MediaTemplate EmbedCab="yes" />
    <Feature Id="ProductFeature" Title="FolderCopySetupProject" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>
  </Product>
  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="PE" />
      </Directory>
    </Directory>
  </Fragment>
  <Fragment>
    <Property Id="DestFilesFolder" Value="C:\Temp\" />
    <Component Id="cmpCC76E631D128DE73CBFBA4A3C6F364AC" Guid="*" 
               Directory="INSTALLFOLDER" KeyPath="yes">
      <File Id="filCDC69907319511E61137A95EF50FAB30"  Source="a.txt" />
      <File Id="filCDC69907319511E61137A95EF50FAB31" Source="b.txt" />
    </Component>

    <Component Id="CMP_LOG4TXT" Guid="*"  
               Directory="INSTALLFOLDER" KeyPath="yes">
      <CopyFile Id="Copy_LOG4TXT" SourceDirectory="INSTALLFOLDER" 
                SourceName="*" 
                DestinationProperty="DestFilesFolder"/>
    </Component>
    <ComponentGroup Id="ProductComponents">
      <ComponentRef Id="cmpCC76E631D128DE73CBFBA4A3C6F364AC" />
      <ComponentRef Id="CMP_LOG4TXT" />
    </ComponentGroup>
  </Fragment>
</Wix>

Вот информация о файле журнала,

Executing op: ComponentRegister(ComponentId={341BD660-7249-42DD-9744-DBEF0776AD52},KeyPath=C:\Program Files (x86)\PE,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0) MSI (s) (A0:64) [11:30:49:374]: Executing op: ActionStart(Name=CreateFolders,Description=Creating folders,Template=Folder: [1]) MSI (s) (A0:64) [11:30:49:375]: Executing op: FolderCreate(Folder=C:\Program Files (x86)\PE\,Foreign=0,,) MSI (s) (A0:64) [11:30:49:379]: Executing op: FolderCreate(Folder=C:\Program Files (x86)\PE\,Foreign=0,,) MSI (s) (A0:64) [11:30:49:380]: Executing op: ActionStart(Name=InstallFiles,Description=Copying new files,Template=File: [1], Directory: [9], Size: [6]) MSI (s) (A0:64) [11:30:49:381]: Executing op: ProgressTotal(Total=2,Type=0,ByteEquivalent=1) MSI (s) (A0:64) [11:30:49:381]: Executing op: SetTargetFolder(Folder=C:\Program Files (x86)\PE\) MSI (s) (A0:64) [11:30:49:381]: Executing op: SetSourceFolder(Folder=1\PE\) MSI (s) (A0:64) [11:30:49:381]: Executing op: ChangeMedia(,MediaPrompt=Please insert the disk: ,MediaCabinet=cab1.cab,BytesPerTick=65536,CopierType=2,ModuleFileName=C:\Windows\Installer\37a12097.msi,,,,,IsFirstPhysicalMedia=1) MSI (s) (A0:64) [11:30:49:381]: Executing op: FileCopy(SourceName=a.txt,SourceCabKey=filCDC69907319511E61137A95EF50FAB30,DestName=a.txt,Attributes=512,FileSize=1,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,,,InstallMode=58982400,HashOptions=0,HashPart1=-1183465204,HashPart2=-1464405568,HashPart3=-493239503,HashPart4=1629910889,,) MSI (s) (A0:64) [11:30:49:382]: File: C:\Program Files (x86)\PE\a.txt; To be installed; Won't patch; No existing file MSI (s) (A0:64) [11:30:49:382]: Source for file 'filCDC69907319511E61137A95EF50FAB30' is compressed

Похоже, что файлы не доступны в "INSTALLFOLDER" для копирования, я не уверен, как упорядочить компоненты для выполнения по порядку. (InstallExecuteSequence On="AfterInstall" что-то в этом роде)

Любая помощь будет очень высоко ценится

Спасибо Раджеш

3 ответа

Я столкнулся с точно такой же ситуацией и смог ее решить.

<CustomAction Id="BaselineSync_Cmd" Property="BaselineSync" Execute="immediate"
    Value="&quot;robocopy&quot; &quot;[BUP]&quot; &quot;[PROD]&quot; /PURGE /e" />
<CustomAction Id="BaselineSync" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<CustomAction Id="RoboCopy_Cmd" Property="RoboCopy" Execute="immediate"
    Value="&quot;robocopy&quot; &quot;[INSDIR]&quot; &quot;[PROD]&quot; /e" />
<CustomAction Id="RoboCopy" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

<InstallExecuteSequence>
    <Custom Action="BaselineSync_Cmd" After="StartServices"><![CDATA[NOT(Installed) AND (PROD <> "") AND (BUP <> "(none)")]]></Custom>
    <Custom Action="BaselineSync" After="BaselineSync_Cmd"><![CDATA[NOT(Installed) AND (PROD <> "") AND (BUP <> "(none)")]]></Custom>
    <Custom Action="RoboCopy_Cmd" After="BaselineSync"><![CDATA[NOT(Installed) AND (BUP <> "") AND (INSDIR <> "(none)")]]></Custom>
    <Custom Action="RoboCopy" After="RoboCopy_Cmd"><![CDATA[NOT(Installed) AND (BUP <> "") AND (INSDIR <> "(none)")]]></Custom>
</InstallExecuteSequence>

Здесь происходит следующее: когда мы вызываем установщик, мы передаем три переменные, INSDIR, BUP и PROD. Это пути.

Содержимое установщика выталкивается до значения INSDIR. Затем файлы и папки в BUP копируются в файлы и папки в PROD. У нас есть /PURGE операция, которая означает, что PROD сначала удаляется. Как только файлы BUP скопированы в PROD, мы копируем файлы / папки INSDIR поверх PROD и перезаписываем содержимое. Это отлично сработало для меня.

Возможно, вы можете попробовать элемент CopyFile. А еще лучше: используйте последовательность запуска вашего приложения, чтобы выполнить копирование любого файла при первом запуске, чтобы избежать перепутывания этой операции с вашими настройками.

Скопируйте файл с места установки в другое место в wix при установке

На данный момент Wix не может копировать папку в нескольких местах во время установки

Хотя это распространенный сценарий, но Wix не может справиться с этим

Как скопировать папку (не файл) во время установки с WiX?

Другие вопросы по тегам