使用 doskey 在运行时评估环境变量

Fiz*_*izz 6 batch-file doskey

我正在创建一个简单的环境设置 cmd 脚本,我正在使用它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"
Run Code Online (Sandbox Code Playgroud)

我希望发生的是我可以使用trunk宏来设置PROJECT_ROOT变量,然后使用延迟扩展导航到这个新设置的变量。然后,如果我使用该trunk2命令,它将再次重置PROJECT_ROOT变量并导航到该位置。最后,通过PROJECT_ROOT动态设置变量,无论我在哪个项目根目录下roottools宏和宏都可以相同。

不幸的是,这不起作用,因为它似乎PROJECT_ROOT在创建宏时进行了评估。所以运行宏的结果trunk是变量被设置,然后执行cd "".

有什么办法可以让宏重新评估PROJECT_ROOT变量,以防它发生变化?

MC *_* ND 4

您不需要延迟扩展即可使其正常工作

@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"
Run Code Online (Sandbox Code Playgroud)

不要设置变量并更改到目标文件夹,而是更改活动目录,然后设置变量。

创建宏时,%%var%%将在不扩展变量的情况下转换批处理文件内部。%var%调用宏时变量将被扩展。