如何取得在%Path%中指令的路徑

我的需求是想將某一個執行檔或batch file,安裝到先前已部屬好的應用程式中。因為只是小工具集,本身也沒有替它設定%TOOL_HOME%之類的變數到系統中。於是我想說: 只要知道之前某一個設在%PATH%中的batch file在哪裡,就可把它給部屬到對應的位置。於是我實做了這個batch幫我取得路徑:

@echo off

set BASE=%~dp0

set DIR_RESULT=
for /f "usebackq tokens=*" %%i in (`where %1 2^> nul`) do (
set DIR_RESULT=%%~dpi
goto :break
)
:break

if not "%DIR_RESULT%" == "" echo %DIR_RESULT%
if "%DIR_RESULT%" == "" echo Can't find %1.


方法就是透過for loop + usebackq去取得指令執行結果。有幾點要注意:

  1. for必須要有usebackq參數,這樣它才知道後面的in (set)是指令。
  2. where %1 2^> nul: 如果指令不存在會dump出錯誤訊息,我透過2>null讓它輸出至NULL Device,可以避免要去處理這種情況。(一開始我的寫法是去處理這種情況)
  3. 透過goto :break讓它只loop一次: 可能會找到多個路徑,但我只需要一個結果就好。
  4. 找不到的話,%DIR_RESULT%會是空字串

友藏內心獨白: 不斷的嘗試與學習才會領悟出更好的寫法。