差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:installanywhere:slashinstallpathproblemonwindows [2016/02/03 11:00] tony |
java:installanywhere:slashinstallpathproblemonwindows [2016/02/03 18:50] tony [How to resolve?] |
||
---|---|---|---|
行 2: | 行 2: | ||
====== Forward-Slash的安裝路徑,在Windows上無法正常反安裝 ====== | ====== Forward-Slash的安裝路徑,在Windows上無法正常反安裝 ====== | ||
===== Problem ===== | ===== Problem ===== | ||
+ | 在Windows上,silent mode properties中的USER_INSTALL_DIR,建議使用double backward-slash去當分隔號: | ||
+ | <code> | ||
+ | USER_INSTALL_DIR=C:\\Product\\Sub-Product1 | ||
+ | </code> | ||
+ | 然而有時為了和Linux一致,會改用: | ||
+ | <code> | ||
+ | USER_INSTALL_DIR=C:/Product/Sub-Product1 | ||
+ | </code> | ||
+ | 透過2008產生的Installer使用起來相當正常,而在2015則會發生無法移除的問題:\\ | ||
+ | {{:java:installanywhere:ia_no_product_id.png|}}\\ | ||
+ | \\ | ||
+ | 在移除資料夾後,按新增移除程式的移除可能會發生以下錯誤:\\ | ||
+ | {{:java:installanywhere:ia_cant_uninstall_add_remove_panel.png|}}\\ | ||
+ | \\ | ||
+ | 發生這個問題後,我是直接刪除以下Registry好重新安裝: | ||
+ | <code> | ||
+ | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${MyProduct} | ||
+ | </code> | ||
+ | ===== How to resolve? ===== | ||
+ | 在GUI模式下,即使你輸入forward-slash,InstallAnywhere也會強制把你轉成back-slash。如果把它列為使用上限制,還是有使用者會不小心踩雷;而且forward-slash不能用,有些難搞的使用者也會提出質疑。因此我最後想到的方法是,直接將forward-slash轉為back-slash。就我所知,有幾個方法可以達到我們這個目的: | ||
+ | - 透過Batch取代,將output轉入變數 | ||
+ | - Execute Custom Code | ||
+ | 要使用Execute Custom Code,我們必須額外去implement java code,還要做包裝。我嫌麻煩,就挑了Batch去做取代的方式:\\ | ||
+ | \\ | ||
+ | 我的第一個方法,是直接將字串中的/取代為\後,就直接echo: | ||
+ | <code bash> | ||
+ | @echo off | ||
+ | set INSTALL_PATH=$USER_INSTALL_DIR$ | ||
+ | set INSTALL_PATH=%INSTALL_PATH:/=\% | ||
+ | echo %INSTALL_PATH% | ||
+ | </code> | ||
+ | 但執行就是不成功,也發現log中的路徑後有跳行符號。我推測可能是echo的原因,所以調整了script,讓輸出不會跳行: | ||
+ | <code bash> | ||
+ | @echo off | ||
+ | set INSTALL_PATH=$USER_INSTALL_DIR$ | ||
+ | set INSTALL_PATH=%INSTALL_PATH:/=\% | ||
+ | set /p="%INSTALL_PATH%"<nul | ||
+ | </code> | ||
+ | 然而這個做法,路徑後一樣有跳行符號。我想,這應該是assign標準輸出的問題,最後只好將內容輸出成一個properties檔案,再透過Properties File Reader去把它讀出來Override:\\ | ||
+ | {{:java:installanywhere:ia_refine_user_install_dir_group.png|}}\\ | ||
+ | \\ | ||
+ | 由於要將路徑輸出到prop中,back-slash必須是兩個,因此會將/與\取代為兩個\,最後再寫到安裝暫存目錄中: | ||
+ | <code bash> | ||
+ | @echo off | ||
+ | set INSTALL_PATH=$USER_INSTALL_DIR$ | ||
+ | set INSTALL_PATH=%INSTALL_PATH:\=\\% | ||
+ | set INSTALL_PATH=%INSTALL_PATH:/=\\% | ||
+ | set /p="%INSTALL_PATH%"<nul | ||
+ | echo USER_INSTALL_DIR=%INSTALL_PATH%>$lax.user.dir$$/$tmp.properties | ||
+ | </code> | ||
+ | 接著當然是將此檔案給讀出來,去覆蓋$USER_INSTALL_DIR$:\\ | ||
+ | {{:java:installanywhere:ia_read_tmp_prop.png|}} | ||
===== Reference ===== | ===== Reference ===== |