• 週二. 2 月 17th, 2026

天南訊息

IT 工作者的工作紀錄

INI 檔案與環境變數使用

個人頭像照片

By伍芳左

1 月 25, 2026

在 ini 裡面 可以 使用 LOCALAPPDATA 變數 嗎

簡單來說:在標準的 .ini 檔案格式中,並不直接支援使用 %LOCALAPPDATA% 這種環境變數。

.ini 檔案本質上只是純文字,讀取它的**程式(軟體)**必須具備「解析變數」的功能,變數才會生效。如果程式沒有特別寫這段邏輯,它會把 %LOCALAPPDATA% 當作一個普通的字串處理,進而導致路徑錯誤。

1. 為什麼通常不能直接使用?
標準的 Windows API(如 GetPrivateProfileString)在讀取 .ini 時,並不會自動幫你把環境變數轉換成實際路徑。

預期路徑: C:\Users\Name\AppData\Local\MyApp

程式讀到的結果: %LOCALAPPDATA%\MyApp(程式會找不到這個資料夾)

2. 例外情況
有些軟體在設計時,會考慮到移植性(Portability),它們會在讀取設定後,額外執行一段程式碼來展開(Expand)環境變數。

哪些會支援: 某些遊戲、開源工具或自定義腳本(如 AutoHotkey、一些編譯器的設定檔)。

如何確認: 查閱該軟體的官方說明文件,搜尋 “environment variables” 或 “substitution”。

3. 常見的解決方案
如果你是該程式的開發者,或者正在撰寫自動化腳本,可以參考以下幾種方式來處理:

A. 在程式碼中展開(開發者適用)
如果你的程式是用 C#、Python 或 C++ 寫的,你可以在讀取字串後手動轉換:

C#: Environment.ExpandEnvironmentVariables(iniValue);

Python: os.path.expandvars(ini_value)

B. 使用相對路徑
許多軟體支援相對於「執行檔」的路徑(例如使用 .\data),這通常比使用絕對路徑或環境變數更穩定。

C. 使用該軟體專用的佔位符
有些軟體有自己的語法,例如:

{appdata}

$HOME

%CD%

總結建議: 除非你確信該軟體的文件有提到支援環境變數,否則建議使用完整的絕對路徑,或者將檔案放在程式同一個資料夾內使用相對路徑。

您目前是為了哪個特定軟體需要修改 .ini 檔嗎?如果是知名軟體,我可以幫您查詢它是否支援這種語法。

inno SCRIPT STUDIO VU/6A87

如果您是在使用 Inno Script Studio (或其核心 Inno Setup) 來編寫安裝程式腳本,答案是:可以使用,但語法略有不同。

在 Inno Setup 腳本中,您不使用 Windows 的 %LOCALAPPDATA% 寫法,而是使用它內建的 Constants (常數)。

1. 正確的語法
在 [INI] 區段中,請使用大括號 {} 包起來的常數:

正確寫法: {localappdata}

例子:

Ini, TOML
[INI]
FileName: “{localappdata}\MyCompany\Settings.ini”; Section: “Settings”; Key: “Path”; String: “{app}”
2. 常見相關常數對照表
根據您的需求,Inno Setup 提供以下對應的路徑常數:

Windows 環境變數 Inno Setup 常數 實際路徑範例
%LOCALAPPDATA% {localappdata} C:\Users\帳號\AppData\Local
%APPDATA% {userappdata} C:\Users\帳號\AppData\Roaming
%ProgramData% {commonappdata} C:\ProgramData
%USERPROFILE% {userdocs} C:\Users\帳號\Documents
3. 注意事項
寫入權限: {localappdata} 通常不需要管理員權限即可寫入,適合存放使用者個人的設定檔。

與 % 變數的區別: * 如果您在 String: 欄位直接寫 %LOCALAPPDATA%,安裝程式會將這串原始文字直接寫進 .ini 檔,而不是路徑。

如果您希望安裝程式「讀取」目前系統已存在的環境變數,則需使用 {%LOCALAPPDATA%} 語法。

總結建議: 在 Inno Script Studio 中設定 .ini 時,請將 %LOCALAPPDATA% 改寫為 {localappdata}。

您是想在安裝時幫使用者建立設定檔,還是要讀取現有的設定呢?我可以提供更具體的腳本範例。

C:\Program Files (x86)\KIIN_R\KIIN_R.INI 與 C:\Users\QQ\AppData\Local\KIIN_R\KIIN_R.INI 有何不同

這兩個檔案雖然檔名相同,但在 Windows 系統架構中扮演的角色完全不同。簡單來說,一個是**「出廠預設(全域)」,另一個是「個人化設定(私有)」**。

以下是詳細的對比分析:

1. 定位與權限對比
特性 C:\Program Files (x86)\… C:\Users\QQ\AppData\Local\…
性質 全域預設值 (Global) 使用者特定值 (User-specific)
適用對象 這台電腦上的「所有使用者」 僅限使用者「QQ」
修改權限 需要 系統管理員 (Admin) 權限 一般使用者權限即可修改
檔案權限 唯讀 (通常不建議程式執行時寫入) 可讀寫 (程式存放個人偏好設定處)
2. 為什麼會有這兩個檔案?(虛擬化與 UAC)
這涉及到 Windows 的安全機制(UAC):

Program Files 的保護: 早期的程式習慣把設定檔直接存放在安裝目錄。但自 Windows Vista 以後,C:\Program Files 受到保護,一般程式在執行時沒有權限修改這裡的檔案。

AppData 的引入: 為了讓每個使用者有獨立的設定(例如:使用者 A 介面要紅色,使用者 B 要藍色),且不需要管理員權限就能存檔,軟體會將設定寫入 AppData\Local。

3. 程式讀取時的優先順序(通常邏輯)
大多數開發者編寫程式時,會遵循以下邏輯:

啟動時: 先去讀取 Program Files 裡的 .INI 作為基礎底稿(預設參數)。

覆蓋設定: 再去讀取 AppData 裡的 .INI。如果兩邊都有同一個設定(例如 FontSize),會以 AppData 裡的為準。

儲存設定: 當你在軟體介面改了設定點擊「儲存」時,程式只會寫入到 AppData 那份檔案中,不會動到 Program Files。

4. 針對您的 Inno Setup 腳本建議
既然您正在使用 Inno Setup (Inno Script Studio):

如果您要放「預設值」: 應將檔案裝在 {app} 目錄(即 Program Files)。

如果您希望安裝後,程式能正常存檔: 您的程式(EXE)內部邏輯應該去尋找 {localappdata}\KIIN_R\KIIN_R.INI。

常見錯誤: 如果在安裝腳本中將配置檔寫在 Program Files 卻沒在 AppData 建立一份,使用者在執行程式修改設定時,常會因為權限不足導致設定無法存檔(或是被 Windows 自動導向到 VirtualStore 造成設定找不到)。

您是遇到修改設定後重開軟體卻沒生效的問題嗎? 還是正在考慮安裝程式應該要把設定檔放在哪裡?

我還有 一個 XX.EXE 想加入 這裡面 成為 第二個 ICON 怎麼做

在 Inno Script Studio (Inno Setup) 中,要為第二個 .exe 檔案建立桌面或開始功能表圖示(Icon),你需要在腳本的 [Icons] 區段加入新的一行指令。

假設你的第一個程式是 KIIN_R.exe,現在要加入 XX.exe。

1. 修改 [Files] 區段
首先,確保你的 XX.exe 已經被包含在安裝包中:

Delphi
[Files]
Source: “D:\你的路徑\KIIN_R.exe”; DestDir: “{app}”; Flags: ignoreversion
Source: “D:\你的路徑\XX.exe”; DestDir: “{app}”; Flags: ignoreversion
2. 修改 [Icons] 區段
在這裡加入第二行,指向你的 XX.exe:

Delphi
[Icons]
; 第一個程式的圖示
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; Tasks: desktopicon

; 新增:第二個程式 XX.exe 的圖示
Name: “{group}\我的第二個程式”; FileName: “{app}\XX.exe”
Name: “{userdesktop}\我的第二個程式”; FileName: “{app}\XX.exe”; Tasks: desktopicon
參數詳細說明:
Name:

{group}\…:代表在開始功能表的程式群組資料夾內建立圖示。

{userdesktop}\…:代表在使用者桌面建立圖示。

後面的文字(如 我的第二個程式)就是圖示顯示的名字,你可以自由更改。

FileName: 指向安裝後該檔案的實際位置,通常用 {app}\XX.exe。

Tasks: desktopicon:

這行代表「只有當使用者在安裝過程中勾選了『建立桌面圖示』時,才會產生桌面圖示」。

如果你希望強制建立,不論使用者有沒有勾選,就把 ; Tasks: desktopicon 刪掉。

3. 如何自訂圖示(Icon)?
如果你的 XX.exe 裡面沒有內建圖示,或者你想換一個圖示,可以加上 IconFilename:

Delphi
Name: “{userdesktop}\XX程式”; FileName: “{app}\XX.exe”; IconFilename: “{app}\your_icon.ico”
常見問題:
如果編譯後沒看到圖示?

請檢查 [Tasks] 區段是否有定義 desktopicon:

Delphi
[Tasks]
Name: “desktopicon”; Description: “{cm:CreateDesktopIcon}”; GroupDescription: “{cm:AdditionalIcons}”; Flags: unchecked
檢查 XX.exe 是否真的有被複製到 {app} 目錄下。

需要我幫你寫一段完整的 [Icons] 範例代碼嗎?

既然您決定要加入第二個圖示,以下是您在 Inno Script Studio 中直接調整腳本的完整範例。您可以直接對照您的腳本內容進行修改:

1. 確保兩個檔案都已加入安裝清單
在 [Files] 區段,確認兩個 .exe 都會被安裝到應用程式目錄({app}):

Delphi
[Files]
Source: “KIIN_R.exe”; DestDir: “{app}”; Flags: ignoreversion
Source: “XX.exe”; DestDir: “{app}”; Flags: ignoreversion
2. 設定圖示(Icons)
請找到 [Icons] 區段,按照以下格式排列。這樣一來,安裝完成後,使用者的「開始功能表」和「桌面」都會出現這兩個圖示:

Delphi
[Icons]
; — KIIN_R 的圖示 —
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; Tasks: desktopicon

; — XX.exe 的圖示 —
; 您可以把 “啟動 XX 程式” 改成您想要的名稱
Name: “{group}\啟動 XX 程式”; FileName: “{app}\XX.exe”
Name: “{userdesktop}\啟動 XX 程式”; FileName: “{app}\XX.exe”; Tasks: desktopicon
3. 進階小技巧:如果你想要圖示看起來更專業
區分名稱: 桌面圖示的 Name 建議要不一樣(例如一個叫 KIIN_R 系統,一個叫 XX 輔助工具),否則名稱相同會互相覆蓋。

特定的圖示檔: 如果 XX.exe 本身沒有漂亮的圖示,你可以另外準備一個 .ico 檔一起打包,然後指定它:

Delphi
Name: “{userdesktop}\XX 程式”; FileName: “{app}\XX.exe”; IconFilename: “{app}\icon_file.ico”
確認 Tasks 勾選框: 在 [Tasks] 區段中,請確認有這行,這樣安裝時才會出現「建立桌面圖示」的勾選框:

Delphi
[Tasks]
Name: “desktopicon”; Description: “{cm:CreateDesktopIcon}”; GroupDescription: “{cm:AdditionalIcons}”; Flags: unchecked
接下來您可以這樣做:
在 Inno Script Studio 中點擊 Compile (編譯)。

執行安裝程式,觀察安裝最後一步是否出現了兩個圖示的選項。

檢查桌面是否成功出現了 KIIN_R 與 XX 兩個捷徑。

如果您在編譯時遇到錯誤訊息(例如 “Column 1: Parameter ‘Name’ is required”),請把您的 [Icons] 區段程式碼貼給我,我幫您檢查。

UNINSTSORE 也加入

在 Inno Setup 中,通常不需要手動為「解除安裝程式」建立圖示,因為 Windows 會自動將它放在「設定 > 應用程式與功能」以及「控制台」中。

但如果您希望在**開始功能表(Start Menu)**中也提供一個「解除安裝」的快捷鍵,讓使用者方便找到,可以按照以下方式加入:

修改 [Icons] 區段
請在您的 [Icons] 區段加入下面這一行(使用 {uninstallexe} 常數):

Delphi
[Icons]
; — KIIN_R 的圖示 —
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; Tasks: desktopicon

; — XX.exe 的圖示 —
Name: “{group}\啟動 XX 程式”; FileName: “{app}\XX.exe”
Name: “{userdesktop}\啟動 XX 程式”; FileName: “{app}\XX.exe”; Tasks: desktopicon

; — 新增:解除安裝圖示 (Uninstall) —
; 這會在開始功能表的群組資料夾內建立一個名為「解除安裝 KIIN_R」的捷徑
Name: “{group}\解除安裝 KIIN_R”; FileName: “{uninstallexe}”
注意事項與建議
為什麼不建議放在桌面? 通常不建議把「解除安裝」放在桌面({userdesktop}),因為使用者可能會不小心誤點。放在開始功能表的 {group}(程式群組)內是比較標準的做法。

圖示美化: 解除安裝預設會使用 Windows 的垃圾桶或系統圖示。如果您想讓它看起來更專業,可以使用 IconFilename 指向一個自訂的圖示。

確認 DefaultGroupName: 請確保您的 [Setup] 區段有設定 DefaultGroupName,這樣這些圖示才會被整齊地收納在同一個資料夾裡:

Delphi
[Setup]
AppName=KIIN_R 系統
DefaultGroupName=KIIN_R 軟體系列
完整範例預覽
您的開始功能表最後會看起來像這樣:

KIIN_R 軟體系列 (資料夾)

KIIN_R

啟動 XX 程式

解除安裝 KIIN_R

您目前在 Inno Script Studio 編譯時有遇到任何紅色字體的錯誤碼嗎?

我的 *.EXE 圖像 可以 連結 到 %SystemRoot%\System32\SHELL32.dll 並使用 裡面的圖像嗎

可以的!在 Inno Setup 中,你可以透過 IconFilename 指定 SHELL32.dll,並利用 IconIndex 來選擇該 DLL 檔案中的特定圖示。

以下是具體的做法:

1. 語法範例
在 [Icons] 區段中,加入 IconFilename 指向系統路徑,並指定索引編號:

Delphi
[Icons]
; 使用 SHELL32.dll 裡的第 14 號圖示(通常是開啟檔案的圖示)
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 14

; 使用 SHELL32.dll 裡的第 23 號圖示(通常是垃圾桶,適合解除安裝)
Name: “{group}\解除安裝 KIIN_R”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
2. 關鍵參數說明
{sys}: 這是 Inno Setup 的常數,會自動對應到 C:\Windows\System32,這比寫死路徑更安全。

IconIndex: 這是圖示在 DLL 檔案中的索引號(從 0 開始計算)。

注意:不同版本的 Windows,SHELL32.dll 內的圖示順序可能略有不同。

3. 如何找到圖示的索引編號(Index)?
你可以透過以下簡單步驟在 Windows 裡預覽編號:

在桌面隨便找一個捷徑,按右鍵 > 內容。

點擊 「變更圖示」 按鈕。

在路徑欄輸入 %SystemRoot%\System32\SHELL32.dll 並按 Enter。

出現的圖示清單中,從左上角往下數:

第一行左一為 0

第一行左二為 1

以此類推。

4. 常用圖示編號參考 (Windows 10/11)
以下是一些常見的圖示編號:

3: 資料夾圖示

14: 文字檔/開啟圖示

31: 解除安裝/垃圾桶相關圖示

43: 驚嘆號/幫助圖示

166: 電腦/系統圖示

5. 特別注意:環境變數的寫法
在 Inno Setup 的腳本中,不需要寫 %SystemRoot%。

請直接使用 {sys}\shell32.dll。

Inno Setup 會在安裝時自動幫你找到正確的 Windows 系統資料夾,這樣不論使用者的 Windows 裝在 C 槽還是 D 槽都能正常運作。

您是想要為 XX.exe 找一個特定的功能圖示(例如齒輪、扳手之類的)嗎?我可以幫您查大概的編號。

如果您想為 XX.exe 找一個特定圖示,在 Windows 10/11 的 SHELL32.dll 中,以下是一些常見且適合「工具」或「副程式」的圖示編號:

1. 建議的圖示編號(IconIndex)
圖示樣式 編號 (IconIndex) 建議用途
齒輪 (Gear) 71 或 316 設定、工具、後台程式
板手與螺絲起子 72 修復工具、維護程式
藍色驚嘆號 (i) 76 說明文件、關於我們
小電腦 (Monitor) 15 系統監控、主程式
放大鏡 (Search) 22 搜尋工具、檢視器
鑰匙 (Key) 47 權限管理、登入程式
2. 您的完整 [Icons] 區段範例
您可以直接複製這段並修改名稱與編號:

Delphi
[Icons]
; 主程式:使用 SHELL32.dll 的第 15 號圖示 (電腦)
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15; Tasks: desktopicon

; XX 程式:使用 SHELL32.dll 的第 71 號圖示 (齒輪)
Name: “{group}\XX 輔助工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71
Name: “{userdesktop}\XX 輔助工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71; Tasks: desktopicon

; 解除安裝:使用 SHELL32.dll 的第 31 號圖示 (垃圾桶/解除)
Name: “{group}\解除安裝 KIIN_R”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
3. 如何在 Inno Script Studio 中快速預覽?
雖然 Inno Script Studio 是寫代碼,但您可以利用 Windows 的「變更圖示」視窗來快速對照編號:

按 Win + R 鍵,輸入 shell32.dll(這會開啟資料夾,不用理它)。

在任意捷徑按右鍵 > 屬性 > 變更圖示。

在路徑欄貼上:C:\Windows\System32\shell32.dll。

數數看: 從左往右,從上往下數。

第 1 行: 0, 1, 2, 3…

第 2 行: 4, 5, 6, 7…

以此類推。

4. 還有一個更漂亮的圖示庫
如果 SHELL32.dll 裡的圖示太舊了,您可以試試 Windows 內建的另一個現代圖示庫:

路徑: {sys}\imageres.dll

特點: 這裡面的圖示是 Windows 10/11 風格,比較精緻。

範例: IconFilename: “{sys}\imageres.dll”; IconIndex: 11 (這是一個藍色的齒輪)。

您想試試看 imageres.dll 的圖示,還是就用傳統的 shell32.dll 呢?

都試試

沒問題,我們可以同時測試這兩個系統內建的圖示庫。shell32.dll 風格比較經典(復古),而 imageres.dll 則包含了大量 Windows 10/11 的高解析度現代圖示。

以下是為您準備的兩組方案,您可以根據喜好選擇:

方案 A:使用 imageres.dll (現代風格,推薦)
這是目前 Windows 介面主流的圖示庫,色彩較豐富且平滑。

Delphi
[Icons]
; 主程式:使用 imageres.dll 的第 11 號圖示 (藍色齒輪/工具組合)
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 11
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 11; Tasks: desktopicon

; XX 程式:使用 imageres.dll 的第 181 號圖示 (盾牌或防護,適合輔助工具)
Name: “{group}\XX 輔助工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 181
Name: “{userdesktop}\XX 輔助工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 181; Tasks: desktopicon

; 解除安裝:使用 imageres.dll 的第 162 號圖示 (回收桶)
Name: “{group}\解除安裝 KIIN_R”; FileName: “{uninstallexe}”; IconFilename: “{sys}\imageres.dll”; IconIndex: 162
方案 B:使用 shell32.dll (經典風格)
如果您喜歡傳統 Windows 的感覺,這組是最穩定的選擇。

Delphi
[Icons]
; 主程式:使用 shell32.dll 的第 16 號圖示 (筆記型電腦)
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 16
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 16; Tasks: desktopicon

; XX 程式:使用 shell32.dll 的第 21 號圖示 (黃色資料夾與文件)
Name: “{group}\XX 輔助工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 21
Name: “{userdesktop}\XX 輔助工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 21; Tasks: desktopicon

; 解除安裝:使用 shell32.dll 的第 240 號圖示 (禁止標誌/停止)
Name: “{group}\解除安裝 KIIN_R”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 240
如何快速切換測試?
在 Inno Script Studio 中,您可以先複製其中一組貼上。

點擊 Compile (編譯)。

注意: 您不需要真的安裝。編譯完成後,查看 [Icons] 區段旁邊的預覽(或是直接安裝一次看看桌面效果)。

如果不滿意,只要改動 IconIndex 的數字,再按一次編譯即可。

小提醒
圖示編號: 因為不同版本的 Windows(如 Win10 與 Win11)圖示索引可能會差 1~2 號。如果編出的圖示不是你要的,稍微加減一下 IconIndex 的數字即可。

圖示透明度: imageres.dll 的圖示通常對透明度支援更好,在 Windows 11 下看起來會更專業。

您想知道如何針對不同的 Windows 版本自動切換圖示編號嗎?(雖然通常不必要,但這可以讓您的安裝程式更強大。)

請針對 dbase 2019 使用的語法  就可以了. 其它 能免則免

針對 dBASE 2019 (或是與之相容的 Inno Setup 腳本) 最精簡、直接的寫法如下。

我們跳過所有不必要的解釋,直接針對您要求的 shell32.dll 與 imageres.dll 提供腳本代碼。

1. 使用 Shell32.dll (傳統圖示)
Delphi
[Icons]
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15; Tasks: desktopicon
Name: “{group}\XX_TOOL”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71
Name: “{userdesktop}\XX_TOOL”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71; Tasks: desktopicon
Name: “{group}\UNINSTALL”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
2. 使用 imageres.dll (現代圖示)
Delphi
[Icons]
Name: “{group}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 11
Name: “{userdesktop}\KIIN_R”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 11; Tasks: desktopicon
Name: “{group}\XX_TOOL”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 181
Name: “{userdesktop}\XX_TOOL”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 181; Tasks: desktopicon
Name: “{group}\UNINSTALL”; FileName: “{uninstallexe}”; IconFilename: “{sys}\imageres.dll”; IconIndex: 162
快速檢查清單
{sys}: 自動指向 System32,不需改動。

IconIndex: 修改此數字即可換圖案。

Tasks: desktopicon: 必須確保您的 [Tasks] 區段有定義 desktopicon 才能生效。

需要我幫您確認 [Tasks] 區段的簡約寫法嗎?

我想 建立階層的 在 ’開始’ 那邊, A下面有B,B下面有C 選單 .你能嗎

可以的。在 Inno Setup 中,要建立階層式選單(子資料夾),只需要在 Name 參數中透過反斜線 \ 來定義路徑層級即可。

階層選單語法範例
假設您的主群組名稱是 MyProject,您想要建立 A > B > C 這樣的結構:

Delphi
[Icons]
; 層級 A:放一個檔案在 A 目錄下
Name: “{group}\A\主程式”; FileName: “{app}\KIIN_R.exe”

; 層級 B:在 A 下面建立 B 資料夾,並放一個檔案
Name: “{group}\A\B\副程式XX”; FileName: “{app}\XX.exe”

; 層級 C:在 A > B 下面建立 C 資料夾,並放解除安裝
Name: “{group}\A\B\C\解除安裝”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
關鍵重點說明:
路徑結構: {group} 是您的安裝程式預設的開始功能表資料夾。後面的 \A\B\C\ 會自動被 Windows 轉換成實體的子資料夾。

自動建立: 您不需要預先建立這些資料夾,安裝程式在執行時會自動根據路徑幫您產生。

DefaultGroupName: 請確保您在 [Setup] 區段定義了 DefaultGroupName,例如:

Delphi
[Setup]
DefaultGroupName=KIIN_R_System
這樣最終路徑會是:開始 > KIIN_R_System > A > B > C。

針對 dBASE 2019 環境的簡約建議:
如果您希望「開始」選單看起來最乾淨,建議不要層疊太多層(通常兩層是極限),因為過深的選單會讓使用者很難點選。

範例(簡約兩層):

Delphi
[Icons]
Name: “{group}\應用程式\KIIN_R”; FileName: “{app}\KIIN_R.exe”
Name: “{group}\應用程式\XX工具”; FileName: “{app}\XX.exe”
Name: “{group}\系統維護\解除安裝”; FileName: “{uninstallexe}”
您目前的 DefaultGroupName 設定為什麼名稱?我可以幫您調整成最精確的完整路徑。

萬惠生 下面 電自標單 下 程式更新同步

要在「開始功能表」建立 萬惠生 > 電自標單 > 程式更新同步 這樣的階層選單,請將 [Icons] 區段修改如下:

Delphi
[Setup]
DefaultGroupName=萬惠生

[Icons]
; 在「電自標單」資料夾下建立「程式更新同步」的捷徑
Name: “{group}\電自標單\程式更新同步”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15

; 如果 XX.exe 也要放在同一層
Name: “{group}\電自標單\XX工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71

; 解除安裝建議放在「萬惠生」主目錄下或再開一條路徑
Name: “{group}\解除安裝”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
說明:
DefaultGroupName: 設定為 萬惠生,這會是第一層資料夾。

{group}\電自標單\程式更新同步:

{group} 代表「萬惠生」。

\電自標單\ 會在裡面建立第二層資料夾。

程式更新同步 是最後顯示在選單上的名稱。

這樣使用者點開「開始」選單時,路徑就會是: 萬惠生 → 電自標單 → 程式更新同步。

順便 釘 到 ’開始’ 與 ’工作列’

關於「釘選到開始畫面」與「釘選到工作列」,這是一個很常見的需求,但有一個直接的技術重點必須先讓您知道:

從 Windows 7 以後的版本(尤其是 Windows 10 與 11),微軟基於安全與防止廣告騷擾的考量,禁止安裝程式(如 Inno Setup)透過腳本自動釘選圖示到工作列或開始畫面。

以前可以使用 VBS 腳本模擬點擊,但現在大多數都被 Windows 安全機制封鎖了。不過,針對您的 dBASE 2019 安裝需求,有兩個折衷的處理方式:

1. 建議的做法:讓使用者自行選擇(標準做法)
雖然無法強制「釘選」,但您可以讓安裝程式在完成時詢問使用者是否要「立即執行」,或是在桌面建立明顯的捷徑,由使用者自行右鍵點擊「釘選到工作列」。

2. 替代方案:透過腳本嘗試(但不保證 100% 成功)
如果您一定要嘗試,可以利用 TaskBarTasks 旗標,但這主要僅適用於舊版 Windows 或特定環境:

Delphi
[Icons]
; 基本捷徑
Name: “{group}\電自標單\程式更新同步”; FileName: “{app}\KIIN_R.exe”

; 嘗試釘選到工作列 (這在 Win 10/11 可能無效,但腳本可以留著)
Name: “{userdesktop}\程式更新同步”; FileName: “{app}\KIIN_R.exe”; Tasks: desktopicon
3. 最實用的做法:設定為「安裝後自動啟動」
使用者安裝完通常就想用了,讓程式自動跳出來,比釘選更直接:

Delphi
[Run]
; 安裝結束後,畫面上會出現一個勾選框問「是否執行 程式更新同步」
Filename: “{app}\KIIN_R.exe”; Description: “立即執行 程式更新同步”; Flags: nowait postinstall skipifsilent
您最後的完整腳本邏輯架構:
層級 設定內容
第一層 萬惠生 (由 DefaultGroupName 設定)
第二層 電自標單 (在 Name 欄位加入)
第三層 (圖示) 程式更新同步 (指向 KIIN_R.exe)
圖示來源 shell32.dll 或 imageres.dll
提示: 雖然不能自動釘選,但您可以將最重要的「程式更新同步」放在桌面({userdesktop}),這是目前 Windows 下使用者最能接受的「快速啟動」方式。

需要我幫您整合出一個可以直接貼進 Inno Script Studio 的最終完整版代碼嗎?

我的意思 是在 應用程式 這邊 產生 下一層 選單. 而不是 在 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\萬惠生 產生資料夾

我完全明白您的意思了。您希望的是在 Windows 的「所有應用程式」清單中,直接看到一個具有層級感、可展開的選單,而不是只看到一個硬梆梆的資料夾路徑。

但這裡有一個 Windows 系統設計上的限制必須先讓您知道:

1. Windows 的顯示機制
不論是 Windows 10 還是 11,它們的「開始功能表」顯示邏輯如下:

第一層: 只能是「捷徑」或是「一個資料夾」。

第二層: 如果是資料夾,點開後裡面只能直接放捷徑。

不支援無限階層: Windows 現代介面不支援在「開始」選單裡出現「資料夾套資料夾再套資料夾」的選單展開效果(例如:萬惠生 > 電自標單 > 程式更新同步)。

如果您在 [Icons] 寫了 {group}\電自標單\程式更新同步,Windows 會自動把這層路徑扁平化,或者直接開一個名為「電自標單」的資料夾。

2. 針對您的需求,最接近的解決方案
為了達到「萬惠生」下面直接看到「電自標單」相關功能的視覺效果,建議採用**「前綴命名法」**。這是目前大多數專業軟體(如 Adobe 或 AutoCAD)採用的做法:

Delphi
[Setup]
; 這會讓您的程式在「開始」選單中擁有一個獨立的「萬惠生」分類資料夾
DefaultGroupName=萬惠生

[Icons]
; 捷徑名稱直接包含子項目的名字,讓它排在一起
Name: “{group}\[電自標單] 程式更新同步”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15
Name: “{group}\[電自標單] XX工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71
Name: “{group}\解除安裝”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
3. 如果您一定要「資料夾」形式
如果您堅持要看到資料夾,您的腳本應該這樣寫:

Delphi
[Icons]
; 這會在「萬惠生」資料夾裡面,建立一個名為「電自標單」的子資料夾(在 Windows 檔案總管看得到)
; 但在「開始選單」中,使用者通常要點進去才看得到裡面的東西。
Name: “{group}\電自標單\程式更新同步”; FileName: “{app}\KIIN_R.exe”
4. 關於「釘選」的最後建議
因為 Inno Setup 無法自動釘選,我建議您在 [Run] 區段加上這行,在安裝結束時提醒使用者:

Delphi
[Run]
Filename: “{app}\KIIN_R.exe”; Description: “安裝完成,立即執行程式更新同步 (之後您可以手動右鍵釘選到工作列)”; Flags: postinstall nowait
總結您的最終腳本建議:
為了符合您「萬惠生 > 電自標單 > 程式」的直覺,建議將 DefaultGroupName 設為 萬惠生\電自標單。

這樣在開始功能表會直接出現一個 「萬惠生\電自標單」 的群組,裡面直接放 「程式更新同步」。這是目前最乾淨、最不亂的方法。

Delphi
[Setup]
DefaultGroupName=萬惠生\電自標單

[Icons]
Name: “{group}\程式更新同步”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\imageres.dll”; IconIndex: 11
Name: “{group}\解除安裝”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
您覺得直接把群組名稱定為 「萬惠生\電自標單」 這種方式可以接受嗎?這樣它在開始選單會顯示得非常清楚。

Name: “{localappdata}\KIIN_R” 在這裡 會卡住 需要 按 F9 才過

您在 Inno Script Studio 中遇到需要按 F9(Run/Continue)才能繼續,通常是因為安裝程式在嘗試執行某個動作時,觸發了偵錯中斷或是權限/路徑不存在的錯誤。

在 [Icons] 區段中使用 {localappdata} 是正確的,但如果您的程式在「建立捷徑」時卡住,通常有以下幾個原因:

1. 您可能誤把路徑寫在 Name 參數裡
捷徑的 Name 參數是指「捷徑要放在哪裡」,而不是「目標檔案在哪裡」。

錯誤示範: Name: “{localappdata}\KIIN_R\程式”; FileName: “{app}\KIIN_R.exe”

Windows 不允許將「捷徑檔(.lnk)」直接放在 Local AppData 資料夾內並顯示在選單上。

正確做法:

捷徑應該放在 {group}(開始功能表)或 {userdesktop}(桌面)。

如果您是想設定捷徑的起始位置(Working Directory),請使用 WorkingDir 參數。

2. 資料夾尚未建立
如果您在 [Icons] 裡強行指定一個不存在的資料夾,安裝程式可能會卡住等待系統回應。 解決方法: 在 [Dirs] 區段先建立該資料夾。

Delphi
[Dirs]
Name: “{localappdata}\KIIN_R”
3. 消滅 F9 卡住的現象(完整代碼範例)
請檢查您的 [Icons] 是否長得像這樣?這是在「開始選單」建立捷徑,但讓程式在 Local AppData 執行的正確寫法:

Delphi
[Icons]
; 將捷徑放在「萬惠生」選單內,但指定程式執行目錄在 LocalAppData
Name: “{group}\電自標單\程式更新同步”; \
FileName: “{app}\KIIN_R.exe”; \
WorkingDir: “{localappdata}\KIIN_R”; \
IconFilename: “{sys}\shell32.dll”; IconIndex: 15
為什麼會卡住需要按 F9?
這代表 Inno Script Studio 的 Debugger (偵錯器) 抓到了一個例外(Exception):

權限問題: 雖然 LocalAppdata 一般不需權限,但如果該目錄被設定為唯讀,建立捷徑會失敗。

參數遺漏: 如果 FileName 指向的路徑不存在,編譯器在測試執行時會停下來報錯。

建議嘗試步驟:
取消偵錯執行: 不要按編譯器裡的「播放(Run)」按鈕,改按 「Build (編譯)」 產出 .exe 安裝檔。

直接執行安裝檔: 直接去輸出資料夾執行產出的安裝檔,看會跳出什麼錯誤視窗。通常直接執行的錯誤訊息比偵錯模式更清楚。

您原本卡住的那一行代碼是怎麼寫的?您可以貼出來,我直接幫您找出哪個參數寫錯了。

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\K 萬蕙昇外掛系統 可以 看到相關 捷徑.. 但是 在 開始 全部 這邊 卻看不到全部 為何

這是一個 Windows 10/11 常見的「選單索引」問題。雖然檔案總管路徑裡看得到捷徑,但「開始選單」沒顯示,通常是因為 資料夾階層太深 或 Windows 索引資料庫尚未更新。

以下是幾個關鍵原因與解決方法:

1. Windows 的「資料夾捷徑」限制 (最可能的原因)
Windows 10 和 11 的開始選單對資料夾階層有嚴格限制。

現象: 如果你在 Programs 下面建立了 萬蕙昇外掛系統,然後又在裡面建了 電自標單 等子資料夾,Windows 的「所有應用程式」清單有時會直接忽略資料夾,只抓取最底層的「捷徑檔案」。

解決: 嘗試扁平化路徑。把捷徑直接放在 DefaultGroupName 之下,不要再開子資料夾。

2. 捷徑名稱包含非法字元或路徑過長
如果路徑(含中文與空格)超過 260 個字元,或者捷徑名稱有特殊符號,Windows 索引會跳過它。

3. 如何在 Inno Setup 中修正(代碼範例)
建議您將捷徑改為「直接列出」,這樣在「所有應用程式」中才容易被看見:

Delphi
[Setup]
; 這裡的名字不要太長,簡潔為主
DefaultGroupName=萬蕙昇外掛系統

[Icons]
; 不要再用 {group}\子目錄\捷徑,直接用 {group}\捷徑
Name: “{group}\[電自標單] 程式更新同步”; FileName: “{app}\KIIN_R.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 15
Name: “{group}\[電自標單] XX工具”; FileName: “{app}\XX.exe”; IconFilename: “{sys}\shell32.dll”; IconIndex: 71
Name: “{group}\解除安裝”; FileName: “{uninstallexe}”; IconFilename: “{sys}\shell32.dll”; IconIndex: 31
4. 為什麼在開始選單看不到?(手動強制刷新)
如果您剛安裝完,開始選單沒出現,請嘗試以下步驟:

重啟 Explorer: 打開工作管理員,找到「Windows 檔案總管」,按右鍵選擇「重新啟動」。

搜尋檢查: 直接在開始選單搜尋 KIIN。如果搜尋得到,代表捷徑存在,只是 Windows 覺得它是「資料夾項目」而暫時沒顯示在「所有應用程式」的字母清單裡。

確認捷徑是否有效: 去 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\K 萬蕙昇外掛系統 手動點擊那些捷徑。如果捷徑點了沒反應(例如指向 {localappdata} 的路徑有錯),Windows 就不會把它顯示在開始選單。

5. 關於您提到的 Name: “{localappdata}\KIIN_R”
這就是為什麼您會卡住按 F9 的關鍵!

Name 參數只能放捷徑的存放位置。 * 如果您寫 Name: “{localappdata}\…”,您是強迫 Windows 把捷徑存進 AppData,而 Windows 的開始選單並不會去讀取那個位置的捷徑。

正確邏輯: 捷徑存在 {group} (開始功能表),但執行內容 (WorkingDir) 設為 {localappdata}。

建議下一個動作: 請將您的 [Icons] 區段代碼貼給我看。我懷疑您的 Name: 參數設定到了非標準的路徑,導致 Windows 開始選單抓不到這些捷徑。

Name: “{localappdata}\KIIN_R” 資料夾存在 就 不新增嗎 ?

在 Inno Setup 的 [Dirs] 區段中,預設行為就是「如果資料夾已存在,就不會重複建立,也不會報錯」。

但是,如果您在腳本中看到它「卡住」或需要按 F9,通常是因為權限衝突或腳本邏輯中有其他檢查(例如 Check 參數)在執行。

1. 正常的 [Dirs] 寫法
在 Inno Setup 中,您只需要這樣寫,它就會自動判斷:如果資料夾不在就建立,在的話就直接跳過。

Delphi
[Dirs]
; 如果 C:\Users\QQ\AppData\Local\KIIN_R 存在,這行會自動跳過,不會報錯
Name: “{localappdata}\KIIN_R”
2. 為什麼您會覺得它在「重複新增」或卡住?
如果您希望更精確地控制(例如:只有在不存在時才執行特定動作),或者想避開偵錯器(Debugger)的誤判,可以使用 Check 參數來手動檢查:

Delphi
[Dirs]
; 只有當資料夾不存在時,才執行建立動作
Name: “{localappdata}\KIIN_R”; Check: not DirExists(ExpandConstant(‘{localappdata}\KIIN_R’))
DirExists: 這是內建函數,用來檢查資料夾是否存在。

ExpandConstant: 用來把 {localappdata} 轉換成真實路徑(如 C:\Users\…)。

3. 解救「開始選單」看不到的問題
您提到在 C:\ProgramData\… 看得到捷徑,但「開始選單」卻看不到。這通常是因為您把捷徑路徑寫錯了。

請檢查您的 [Icons]:

錯誤寫法: Name: “{localappdata}\KIIN_R\捷徑名稱”

這會把 .lnk 檔丟進 AppData 資料夾,Windows 開始選單絕對不會去那裡找圖示。

正確寫法:

捷徑放在 {group}(開始功能表)。

讓程式去讀取 {localappdata} 的設定。

Delphi
[Icons]
; 捷徑一定要放在 {group} 或 {userdesktop},使用者才看得到
Name: “{group}\程式更新同步”; FileName: “{app}\KIIN_R.exe”; WorkingDir: “{localappdata}\KIIN_R”
4. 解決 F9 卡住的終極建議
如果您在執行 Inno Script Studio 時一直卡在某一行,這通常是 Debugger (偵錯模式) 的干擾。

試試看這樣做:

不要點綠色的「Run/Play」按鈕。

點擊功能列的 Project > Build (或按 Ctrl+F9)。

編譯完成後,去輸出目錄手動執行 .exe 安裝檔。

這樣就不會觸發偵錯器中斷,安裝程式會順暢地跑完。

您目前腳本中,除了 Name: “{localappdata}\KIIN_R” 這一行,後面還有加任何 Flags 嗎?

個人頭像照片

By 伍芳左

MIS, ERP Pro... RHCE Member (7.2)

發表迴響