2015-11-02 75 views
0

我調整了一個程序來停止需要管理員權限或將數據文件寫入其安裝程序文件目錄。這些文件不是由程序創建的,而是經過修改的:它們存在於全新安裝中,即使它們是空的(反正真的不是這樣)。WiX保存ProgramFiles中存儲的舊數據文件

現在我需要調整安裝程序,對於額外的要求,如果有以前版本的文件,我必須以某種方式保留它們,所以程序使用它們而不是默認的。之前的MSI(不是由WiX製作的)在卸載後將這些文件留下。

我對程序本身的解決方案是像以前一樣將默認數據文件直接安裝到INSTALLFOLDER/programfiles中,但是如果文件存在於appdata中,則在每次運行時檢查程序,否則從程序文件中複製新的文件,然後開始使用新的路徑。我這樣做是因爲我仍然希望這是每用戶數據,但我不能依靠安裝來將文件存儲在當前和未來的每個用戶配置文件中;我認爲這不是MSI應該做的。 (順便說一下,我錯了嗎?)

現在安裝效果我認爲最好的是繼續安裝新的數據文件到程序文件,但有MSI移動現有的文件,如果有的話(如果沒有數據文件在程序文件安裝中應該繼續),到appdata中(這樣它們將被程序找到並使用,用於安裝的用戶)。如果在程序文件和應用程序數據中都找到了案件文件(我認爲後者會更近),那麼錦上添花可以解決衝突。

這是我第一次嘗試:

<Directory Id="AppDataFolder"> 
      <Directory Id="appdataDirAuthor" Name="authorName"> 
       <Directory Id="appdataDir" Name="productName"> 
        <Component Id="dbPreserve" Permanent="yes" Guid="XXXXXX"> 
         <CopyFile Id="dbPreserveFoo" Delete="yes" DestinationDirectory="appdataDir" SourceDirectory="dbDir" SourceName="Foo*.*" /> 
        </Component> 
       </Directory> 
      </Directory> 
     </Directory> 

當然,我感到我必須使用註冊表的keyPath錯誤,我失蹤RemoveFile。但我想要的是一次性拷貝,而且我不需要或希望操作系統來跟蹤它,因爲我只是模仿軟件本身如何將文件留在應用程序數據中,卸載不會觸摸。

也許這更適合MSI之外通過自定義操作運行的特別腳本?

  • 什麼是最好的方式來完成這個文件複製(通過MSI標準動作或不)?
  • 這是複製最好還是最不好的方式來完成我的原始目標?

非常感謝提前。

回答

0

好吧,在閱讀權威答案this other question後,我重申這種事情不適合安裝人員完成。

只是爲了信息這是Windows的批處理腳本,我會轉而使用(前InstallFiles):

@echo off 

if exist "%APPDATA%\authorName\prodName\Foo.bar" exit /b 0 

set dirOrig=0 
if exist "%ProgramFiles(x86)%\prodNameOld\DATABASE\Foo.bar" set dirOrig=%ProgramFiles(x86)%\prodNameOld\DATABASE 
if exist "%ProgramFiles(x86)%\prodName\DATABASE\Foo.bar" set dirOrig=%ProgramFiles(x86)%\prodName\DATABASE 
if "%dirOrig%"=="0" exit /b 0 

xcopy "%dirOrig%\Foo.bar" "%APPDATA%\authorName\prodName\" /y 
xcopy "%dirOrig%\etc.*" "%APPDATA%\authorName\prodName\" /y 
del /f/q "%dirOrig%\*.*" 
exit /b 0