Call 在批处理文件中的不同用途

different uses of Call in a batch file

我被分配去理解别人写的代码,目前我能理解一定程度,但有一行让我很困扰

call set mmm=%%mon:~%id%,3%%

据我了解,call 用于启动另一个 batch 文件,但在上面的行中,变量设置为某个值,但我不确定该行的作用。

据我所知,%% 在这里如何使用 % 用于从变量中检索值。

完整代码在这里:

set mon=JANFEB
set id=123
call set mmm=%%mon:~%id%,3%%

这是一个两阶段替换,允许您在解释中使用变量。通常,表达式如:

%str:~start,len%

startlen 必须是数字常量而不是变量。所以这就是你使用变量而不是常量的方式。

开始于:

set mmm=%%mon:~%id%,3%%

在第一阶段,%% 标记被替换为 % 并且 %id% 被替换为 123,给出:

set mmm=%mon:~123,3%

在第二阶段,它的解释与您预期的一样,尽管在这种情况下偏移 123 看起来有点奇怪。

你可以在这里看到效果:

@setlocal enableextensions enabledelayedexpansion
@echo off

rem               1         2         3         4
rem     01234567890123456789012345678901234567890123456
set mon=JAN.FEB.MAR.APR.MAY.JUN.JUL.AUG.SEP.OCT.NOV.DEC
rem                                 ^
rem                                28

set id=28
call set mmm=%%mon:~%id%,3%%
echo %mmm%

endlocal

输出 AUG.

两步:

首先,id的值被代入表达式,所以变成set mmm=%%mon:~123,3%%

然后对表达式求值 - 作为单行 "subroutine",删除 % 的一级:set mmm=%mon:~123,3%

所以,尝试将mmm设置为mon中第1323个字符之后的3个字符(从"character 0"开始计算)

哪个应该 "set" monnothing

(如果 id3,则 mmm 将设置为 Feb