【发布时间】:2016-06-25 22:04:01
【问题描述】:
我尝试使用以下批处理文件自定义 Windows 命令提示符。
@echo off
cls
:cmd
set /p "cmd=%cd%>"
%cmd%
goto cmd
所以,当我打开批处理文件时,它只是将我的命令带入cmd 变量并执行它并再次提示输入新命令。
但以下命令echo %cd% 仅输出 %cd%
然后我启用delayedexpansion 并使用echo !cd! 并获得所需的输出。
我认为,由于延迟扩展,cmd 变量现在持有echo c:\Users\Sourav\Desktop(我说的对吗?)
但是当我尝试打开命令提示符(不是批处理文件)并尝试以下命令时,我感到困惑。
我想,我会得到c:\Users\Sourav\Desktop,但我得到了!cd!。这与我对echo !cd! 在第一种情况下的工作方式的理解相矛盾。
为什么我在第二种情况下得到不同的输出?
谁能建议对批处理文件进行任何改进,以便在第一种情况下使用echo %cd% 获得所需的输出?
【问题讨论】:
-
第一部分看不懂;
%cd%应该总是扩展到当前目录,除非你在做一些字符集技巧。第二部分是有道理的。 CMD 仅扫描输入一次以查找要评估的变量。当您输入%cmd%时,它会扩展为echo !cd!并打印出来。它没有第二次扫描该行以寻找更多变量。 -
初步结果很容易解释:环境变量一般不会递归扩展。延迟扩展是一个单独的阶段,所以这样做是可行的。至于最后一部分,一些快速实验表明延迟扩展仅适用于批处理文件,而不适用于命令行。不会太令人惊讶。
-
正如 Harry 已经指出的,
setlocal enabledelayedexpansion仅适用于批处理文件。默认情况下,命令行延迟扩展是禁用的,但您可以使用cmd /v:on为新实例启用它 -
试试
prompt=$P$G,而不是你的批处理文件... -
@Aacini 我知道。这只是一个用最少代码的例子来解释这种情况。这个批处理可以做其他工作,比如在每个命令之后用当前目录改变提示标题。(就像 openSUSE 在他们的发行版中自定义终端)这不仅仅是改变提示。我可以添加更多代码来显示命令执行所花费的时间等。
标签: windows batch-file cmd command-prompt