我被分配了解到其他人写的代码到目前为止我能在某种程度上理解但是一行导致我麻烦
call set mmm=%%mon:~%id%,3%%
在某种程度上,我理解call
用于启动另一个batch
文件但在上面的行中有变量设置为某个值,但我不确定该行是做什么的。
此外,%%
如何使用%
,我知道set mon=JANFEB
set id=123
call set mmm=%%mon:~%id%,3%%
用于从变量中检索值。
请帮助我理解。完整的代码在这里。
{{1}}
感谢您的时间。
答案 0 :(得分:3)
它是一个两阶段替换,允许您在解释中使用变量。通常,使用如下表达式:
%str:~start,len%
start
和len
必须是数字常量而不是变量。所以这就是你使用变量而不是常量的方式。
从:
开始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
。
答案 1 :(得分:1)
两个步骤:
首先,id
的值被替换为表达式,因此它变为set mmm=%%mon:~123,3%%
然后评估表达式 - 作为单行"子程序",删除一级%
:set mmm=%mon:~123,3%
所以,尝试将mmm
设置为mon
中第1323个字符后面的3个字符(从&#34开始;字符0和#34;)
应该"设置" mon
nothing
(如果id
为3
,那么mmm
将设置为Feb
)