Windows XP命令处理器的调用命令文档中存在一些混淆

时间:2015-07-22 14:23:36

标签: windows batch-file

ss64.com上的引用清楚地提到 call命令可以调用内部命令,而windows xp命令引用并没有提到它。即使旧的MS DOS命令参考也没有提到它。 这就是为什么我发现这种语法令人困惑的原因:

call set X= %X% 与使用for命令的解析功能获取环境变量的扩展值相比,这是扩展用户输入环境变量的优雅方式。 为什么命令处理器必须读取输入变量两次以扩展它? 如果直接输入用户输入的内容,则使用它的命令可以正常工作。 例如。当直接输入时,“%userprofile%\ desktop \ file.txt”对于处理器来说是没脑子的,但是当通过提示输入相同的字符串时系统会丢失。 当输入变量没有空格或特殊字符时,不需要调用它,它可以直接使用。

2 个答案:

答案 0 :(得分:1)

您的混淆来自call set X=%X%替换任何set X=!%X%!功能的for而非这一事实。目的是扩展变量值两次。一个简单的例子:

set /P "str=Enter a string: "
set /P "start=Enter start char: "
set /P "len=Enter number of chars: "

echo The substring is: "!str:~%start%,%len%!"

call echo The substring is: "%%str:~%start%,%len%%%"

很容易意识到无法获取由变量定义的子字符串而不会将值扩展两次:一个用于start / len值,另一个用于对于子串本身。

您的路径也是如此:如果读取的值包含任何%variable%,则无法在不扩展它的情况下获取完整路径!

这里的关键是这些值来自USER INPUT,这与将它们放入批处理文件或在命令提示符下输入它们不同。

编辑:另一个例子;从命令提示符执行它:

C:\> set var=

C:\> set command=echo %var%

C:\> echo %command%
echo %var%

C:\> %command%
%var%

C:\> set var=This is var value

C:\> %command%
%var%

C:\> call %command%
This is var value

答案 1 :(得分:0)

在指定的方案中使用call只会强制批量解析器双倍通过call右侧的命令。以简化的顺序(here完整过程)

  • 第一遍将读取该行,将变量替换为其中的值,并将命令转换为批处理内部表示。在当前批处理上下文中插入call之后,要执行的命令为call文本(尚未将其解析为标识为命令)新命令。

  • 现在,要执行inserted命令,需要再次解析(第二次传递)以生成新命令的内部表示。

如果第一个解析器传递生成了一个变量引用,则第二个传递将使用变量中的值替换此引用。