ss64.com上的引用清楚地提到 call命令可以调用内部命令,而windows xp命令引用并没有提到它。即使旧的MS DOS命令参考也没有提到它。 这就是为什么我发现这种语法令人困惑的原因:
call set X= %X%
与使用for命令的解析功能获取环境变量的扩展值相比,这是扩展用户输入环境变量的优雅方式。
为什么命令处理器必须读取输入变量两次以扩展它?
如果直接输入用户输入的内容,则使用它的命令可以正常工作。
例如。当直接输入时,“%userprofile%\ desktop \ file.txt”对于处理器来说是没脑子的,但是当通过提示输入相同的字符串时系统会丢失。
当输入变量没有空格或特殊字符时,不需要调用它,它可以直接使用。
答案 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命令,需要再次解析(第二次传递)以生成新命令的内部表示。
如果第一个解析器传递生成了一个变量引用,则第二个传递将使用变量中的值替换此引用。