【问题标题】:Please explain following outputs in Windows command prompt请在 Windows 命令提示符中解释以下输出
【发布时间】: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


【解决方案1】:

您需要另一个级别的解析。您可以使用call 这样做:

@echo off
cls
:cmd
set /p "cmd=%cd%>>"
call %cmd%
goto cmd

【讨论】:

  • 我还有一个困惑,!cd! 什么时候扩展?当我们设置cmd 变量时?所以cmd=echo c:\Users\Sourav\Desktop?或者它只存储cmd=echo !cd!,当我们执行%cmd%时,它会扩展为c:\Users\Sourav\Desktop? set /p 是否真的在读取时扩展变量?
  • 扩展变量的不是set,而是解析器。挺复杂的,不过here你可以找到一些很好的解释。
猜你喜欢
  • 2014-04-16
  • 2013-06-21
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多