2016-09-29 76 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