2020-07-30 # 在 32-bit 模式 也要拿到 64-bit `cmd` **tl;dr** 利用 32-bit 模式下的 `%SystemRoot%\Sysnative` 路徑取得 ``` @path %SystemRoot%\Sysnative;%SystemRoot%\System32 @cmd ``` --- 隨處輸入 `cmd` 皆能開啟「命令提示字元」,是因為 `PATH` 環境變數 裡設有 `C:\Windows\System32` 的路徑,而這個位置底下有名稱為 `cmd.exe` 的可執行檔。 執行 `path` 指令,可列出目前 `PATH` 環境變數 的內容, ``` C:\Users\yipo>path PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32 \WindowsPowerShell\v1.0\ ``` 使用 `where` 指令,則可找出 `cmd` 指令在系統上的實際位置, ``` C:\Users\yipo>where cmd C:\Windows\System32\cmd.exe ``` 每當有指令輸入時,系統會從 `PATH` 路徑清單中,逐一尋找該目錄底下有無符合名稱的可執行檔,找到了便執行它 (找不到就報錯)。 --- 在 64-bit Windows,除了有 64-bit 的 `cmd.exe`;也有為了相容而提供的 32-bit `cmd.exe`,分別可在下列位置找到。 - **64-bit:** `C:\Windows\System32\cmd.exe` - **32-bit:** `C:\Windows\SysWOW64\cmd.exe` 在 32-bit 相容模式 下,為達到相容,相同路徑提供的是 32-bit 的 `cmd.exe`。如果需要 64-bit `cmd.exe` 則可透過 `C:\Windows\Sysnative` 取得。 - **64-bit:** `C:\Windows\Sysnative\cmd.exe` - **32-bit:** `C:\Windows\System32\cmd.exe` 可惜的是,`Sysnative` 目錄為 32-bit 相容模式 獨有,在 64-bit 環境會找不到路徑, ``` C:\Users\yipo>C:\Windows\Sysnative\cmd.exe The system cannot find the path specified. ``` 要想點辦法,才能在兩種狀況下,皆順利開啟 64-bit 的 `cmd.exe`… --- **解法⑴** 文章前面提到… 利用 `PATH` 逐一尋找的特性,若把 `Sysnative` 放在清單開頭,路徑不存在就也無妨,往下從其他路徑能夠找到就可以了。 撰寫以下內容,存檔成 *cmd64.bat*, ``` @path %SystemRoot%\Sysnative;%SystemRoot%\System32 @cmd ``` 畢竟更改了 `PATH`,雖不會永久影響系統,但到執行結束前,腳本所執行的指令都有可能受到影響。然而,如果有在各模組自行定義 `PATH` 的好習慣,這是比較簡潔的寫法。 **解法⑵** 想保留 `PATH` 變數不動的話,改為以下寫法, ``` @if exist "%SystemRoot%\Sysnative\" ( "%SystemRoot%\Sysnative\cmd.exe" ) else ( cmd ) ``` 這裡的缺點是,若 `cmd` 需要額外添加參數,會需要重複撰寫兩次。 --- **參照** -- [File System Redirector | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/winprog64/file-system-redirector) {%hackmd @yipo/style %}