GetEnvironmentVariable 是 Delphi 讀取 Windows 環境變數的標準 API。本文整理開發中最常用的系統環境變數對照表,涵蓋系統路徑、使用者設定檔、臨時目錄、處理器資訊等,並提供直接可用的程式碼片段。
uses Windows, SysUtils;
function GetEnvVar(const Name: string): string;
var
Buf: array[0..1023] of Char;
Len: DWORD;
begin
Len := GetEnvironmentVariable(PChar(Name), Buf, SizeOf(Buf));
if Len > 0 then
SetString(Result, Buf, Len)
else
Result := ''; // 變數不存在
end;
// 簡易版 (SysUtils 內建)
function GetEnv(const Name: string): string;
begin
Result := GetEnvironmentVariable(Name);
end;
| 變數名 | 典型值範例 | 用途說明 |
|---|---|---|
| WINDIR | C:\Windows | Windows 系統目錄 |
| SYSTEMROOT | C:\Windows | 同 WINDIR,官方建議使用此變數 |
| SYSTEMDRIVE | C: | 系統安裝磁碟機代號 |
| HOMEDRIVE | C: | 當前使用者家目錄磁碟機 |
| USERPROFILE | C:\Users\Admin | 當前使用者設定檔根目錄 (Win2K+) |
| HOMEPATH | \Users\Admin | 相對於 HOMEDRIVE 的路徑 |
| APPDATA | C:\Users\Admin\AppData\Roaming | 漫遊應用程式資料 (AppData\Roaming) |
| LOCALAPPDATA | C:\Users\Admin\AppData\Local | 本地應用程式資料 (AppData\Local) |
| TEMP / TMP | C:\Users\Admin\AppData\Local\Temp | 當前使用者臨時檔案目錄 |
| PROGRAMFILES | C:\Program Files | 64-bit 程式安裝目錄 |
| PROGRAMFILES(X86) | C:\Program Files (x86) | 32-bit 程式安裝目錄 (64-bit OS) |
| COMMONPROGRAMFILES | C:\Program Files\Common Files | 共用元件目錄 |
| PUBLIC | C:\Users\Public | 所有使用者共用目錄 |
| ALLUSERSPROFILE | C:\ProgramData | 所有使用者應用程式資料 (隱藏) |
| USERNAME | Admin | 當前登入使用者名稱 |
| COMPUTERNAME | DESKTOP-ABC123 | 電腦名稱 |
| OS | Windows_NT | 作業系統家族 (NT 核心) |
| NUMBER_OF_PROCESSORS | 8 | 邏輯處理器數量 |
| PROCESSOR_ARCHITECTURE | AMD64 / x86 | 處理器架構 |
| PROCESSOR_IDENTIFIER | Intel64 Family 6 Model 158 Stepping 10, GenuineIntel | 詳細 CPU 型號字串 |
| PROCESSOR_LEVEL | 6 | 處理器等級 |
| PROCESSOR_REVISION | 9E0A | 處理器修訂版本 |
| USERDOMAIN | DESKTOP-ABC123 / CORP-DOMAIN | 使用者帳號所屬網域/工作群組 |
| COMSPEC | C:\Windows\System32\cmd.exe | 命令解譯器路徑 |
| PATHEXT | .COM;.EXE;.BAT;.CMD;.VBS;.PS1 | 可執行檔副檔名清單 |
| PATH | C:\Windows;C:\Windows\System32;... | 可執行檔搜尋路徑 (極長) |
| PSModulePath | C:\Windows\System32\WindowsPowerShell\v1.0\Modules | PowerShell 模組路徑 |
| OneDrive | C:\Users\Admin\OneDrive | OneDrive 同步資料夾 (若已設定) |
uses ShlObj, ActiveX;
function GetKnownFolder(const FolderID: TGUID): string;
var
Path: PWideChar;
begin
Result := '';
if SHGetKnownFolderPath(FolderID, 0, 0, Path) = S_OK then
try
Result := Path;
finally
CoTaskMemFree(Path);
end;
end;
// 使用範例
var
Desktop, Documents, Downloads: string;
begin
Desktop := GetKnownFolder(FOLDERID_Desktop); // 桌面
Documents := GetKnownFolder(FOLDERID_Documents); // 文件
Downloads := GetKnownFolder(FOLDERID_Downloads); // 下載
// 更多 FOLDERID_* 常數定義於 ShlObj 單元
end;
uses Windows;
function ExpandEnvStr(const Str: string): string;
var
Buf: array[0..4095] of Char;
Len: DWORD;
begin
Len := ExpandEnvironmentStrings(PChar(Str), Buf, SizeOf(Buf));
if Len > 0 then
SetString(Result, Buf, Len - 1) // 扣除結尾 #0
else
Result := Str;
end;
// 使用
ShowMessage(ExpandEnvStr('%USERPROFILE%\Documents')); // 實際路徑
procedure ListAllEnvVars(Strings: TStrings);
var
EnvBlock: PWideChar;
P: PWideChar;
S: string;
EqPos: Integer;
begin
EnvBlock := GetEnvironmentStringsW;
if EnvBlock = nil then Exit;
try
P := EnvBlock;
while P^ <> #0 do
begin
S := P;
EqPos := Pos('=', S);
if EqPos > 0 then
Strings.Add(Copy(S, 1, EqPos - 1) + '=' + Copy(S, EqPos + 1, MaxInt));
Inc(P, Length(S) + 1);
end;
finally
FreeEnvironmentStringsW(EnvBlock);
end;
end;
var
CurDir: string;
begin
CurDir := GetCurrentDir; // SysUtils
ShowMessage(CurDir);
SetCurrentDir('..'); // 切換到父目錄
CurDir := GetCurrentDir;
ShowMessage(CurDir);
SetCurrentDir('..\..');
CurDir := GetCurrentDir;
ShowMessage(CurDir);
end;
WINDIR) 需管理員權限才能修改,但讀取無限制。SetEnvironmentVariable 只影響當前進程及子進程,不影響系統或其他進程。%PROGRAMFILES% 會自動重導向至 Program Files (x86),需用 %PROGRAMW6432% 取得真實 64-bit 路徑。GetEnvironmentVariable 為 Unicode 版 (GetEnvironmentVariableW),直接支援中文路徑。熟悉核心環境變數名稱,配合 GetEnvironmentVariable/ExpandEnvironmentStrings/SHGetKnownFolderPath,即能編寫跨版本、跨使用者、跨架構的路徑處理程式碼。建議將常用路徑取得邏輯封裝為工具單元,統一管理、易於維護。