如何在DOSKEY命令中添加执行后可动态读取的变量
如何在DOSKEY命令中添加执行后可动态读取的变量
嘿,我懂你碰到的这个头疼问题了——给cd命令设置DOSKEY别名后,%cd%总是显示设置别名时的路径,没法跟着你切换目录动态更新,对吧?咱们来一步步搞定它!
问题根源
你原本用的这两条DOSKEY命令:
doskey cd = cd /d $* ^&^& echo "You are in: "%cd% doskey cd = cd /d $* ^&^& title %cd%
之所以失效,是因为CMD在解析DOSKEY命令的瞬间就把%cd%展开成了当前路径,而不是等你执行cd别名的时候才去读取新的路径。相当于这个变量被“固定死”在设置别名的那一刻了。
解决方案:让变量动态读取
这里有两种靠谱的办法,都能实现你要的动态效果:
方法1:启用延迟变量扩展
CMD的延迟变量扩展功能,能让变量在命令执行时才被解析,而不是提前展开。操作步骤如下:
- 先在CMD里执行这条命令开启延迟扩展:
setlocal enabledelayedexpansion - 然后重新设置DOSKEY别名,把
%cd%换成!cd!:
现在再执行doskey cd=cd /d $* ^&^& echo "You are in: "!cd! doskey cd=cd /d $* ^&^& title !cd!cd Users,就能看到输出的是新路径C:\Users啦!
方法2:用for命令间接获取路径
如果你不想开启延迟扩展,也可以用for命令来动态获取当前目录的完整路径,这样同样能避开提前展开变量的问题:
doskey cd=cd /d $* ^&^& for %%i in (.) do echo "You are in: "%%~fi doskey cd=cd /d $* ^&^& for %%i in (.) do title %%~fi
这里的%%~fi会在每次执行cd别名时,重新计算当前目录的完整路径,自然就能得到动态结果。
适配注册表的修改方案
你想要把这个配置加到右键菜单的注册表项里,需要注意转义字符和延迟扩展的开启。修改后的注册表内容如下:
右键文件夹背景(管理员CMD)
[HKEY_CLASSES_ROOT\Directory\Background\shell\cmdmenua] @="Open Command Prompt Here (Admin)" "Icon"="%SystemRoot%\\system32\\cmd.exe" [HKEY_CLASSES_ROOT\Directory\Background\shell\cmdmenua\command] @="powershell -NoLogo -WindowStyle Hidden -Command \"$V = '%V'; Start-Process cmd \\\"/k setlocal enabledelayedexpansion & $($V.Substring(0,2)) & cd \\\"$V\\\" & Title Administrator: $V & doskey cd = cd /d `$* ^&^& title !cd!\\\" -Verb RunAs\" "
右键文件夹内部(管理员CMD)
[HKEY_CLASSES_ROOT\Directory\shell\cmdmenua] @="Open Command Prompt Inside (Admin)" "Icon"="%SystemRoot%\\system32\\cmd.exe" [HKEY_CLASSES_ROOT\Directory\shell\cmdmenua\command] @="powershell -NoLogo -WindowStyle Hidden -Command \"$V = '%V'; Start-Process cmd \\\"/k setlocal enabledelayedexpansion & $($V.Substring(0,2)) & cd \\\"$V\\\" & Title Administrator: $V & doskey cd = cd /d `$* ^&^& title !cd! \\\" -Verb RunAs\" "
这里我们在启动CMD时就通过setlocal enabledelayedexpansion开启了延迟扩展,确保DOSKEY的cd别名能动态更新标题。
备注:内容来源于stack exchange,提问作者justanotherpersonontheweb
相关产品推荐
相关产品推荐

