2016-09-29 82 views
2

我創建了一個簡單的環境設置cmd腳本,我使用doskey來設置各種別名和宏。我所在的環境有各種版本庫,我想創建一些宏以快速瀏覽熱門目錄。使用doskey在運行時評估環境變量

目前,我有以下幾點:

@echo off 
Setlocal EnableDelayedExpansion 

set PROJECTS_PATH=%SystemDrive%\Projects 

echo. Updating path... 

REM Update PATH here 

echo. Setting up macros... 

doskey np="%SystemRoot%\System32\notepad.exe" $* 
doskey np+="%ProgramFiles(x86)%\Notepad++\notepad++.exe" $* 
doskey ..=cd .. 
doskey trunk=set PROJECT_ROOT=%PROJECTS_PATH%\Trunk ^& cd "!PROJECT_ROOT!" 
doskey trunk2=set PROJECT_ROOT=%PROJECTS_PATH%\Trunk2 ^& cd "!PROJECT_ROOT!" 
doskey root=cd "%PROJECT_ROOT%" 
doskey tools=cd "%PROJECT_ROOT%\tools" 

我希望會發生的是,我可以使用trunk宏來設置PROJECT_ROOT變量,然後導航到這個新設置的變量使用延遲擴展。然後,如果我使用trunk2命令,它將再次重置PROJECT_ROOT變量並導航到該位置。最後,在動態設置PROJECT_ROOT變量的情況下,無論我在哪個項目根目錄下,宏可以是相同的。

不幸的是,這不起作用,因爲看起來PROJECT_ROOT是在創建宏時評估的。所以運行宏trunk的結果是變量被設置,然後執行cd ""

有沒有什麼辦法可以讓宏重新評估PROJECT_ROOT變量以防變化?

+1

DOSKEY.exe-在DOS提示符下調用並編輯命令,並創建宏。通俗地說:您無法從批處理文件運行Doskey宏。 – Squashman

+0

當我打開cmd提示符來設置我的環境時,立即調用上面的腳本。對不起,我不確定你想指出什麼。 – Fizz

回答

1

你不需要延遲擴展得到它的工作

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "PROJECTS_PATH=%SystemDrive%\Projects" 

    doskey trunk=cd /d "%PROJECTS_PATH%\trunk" $t set "PROJECT_ROOT=%%cd%%" 
    doskey trunk2=cd /d "%PROJECTS_PATH%\trunk2" $t set "PROJECT_ROOT=%%cd%%" 

    doskey root=cd /d "%%PROJECT_ROOT%%" 
    doskey tools=cd /d "%%PROJECT_ROOT%%\tools" 

而不是設置變量,並切換到目標文件夾,更改活動目錄,然後設置變量。

批處理文件中的%%var%%將被轉換爲%var%而不會在創建宏時擴展該變量。調用宏時,變量將被展開。

+0

這很好用。爲什麼認爲當我使用'$ t'時,我基本上得到某種回聲。例如,當我使用'trunk'時,我得到以下輸出: 'C:\ Windows \ System32> trunk' 'C:\ Projects \ Trunk>' 'C:\ Projects \ Trunk> [cursor is here] ' – Fizz

+0

@Fizz,[文檔](https://technet.microsoft.com/en-us/library/bb490894.aspx)聲明doskey宏內的'$ T'與命令中的'&'相同線。 –

+0

當然,我明白了,但如果我在宏中使用'^&'而不是'$ t',我沒有看到上面的回顯。只是不知道'$ t'是什麼原因造成的。 – Fizz