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%
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
.
两步:
首先,id
的值被代入表达式,所以变成set mmm=%%mon:~123,3%%
然后对表达式求值 - 作为单行 "subroutine",删除 %
的一级:set mmm=%mon:~123,3%
所以,尝试将mmm
设置为mon
中第1323个字符之后的3个字符(从"character 0"开始计算)
哪个应该 "set" mon
到 nothing
(如果 id
为 3
,则 mmm
将设置为 Feb
)
我被分配去理解别人写的代码,目前我能理解一定程度,但有一行让我很困扰
call set mmm=%%mon:~%id%,3%%
据我了解,call
用于启动另一个 batch
文件,但在上面的行中,变量设置为某个值,但我不确定该行的作用。
据我所知,%%
在这里如何使用 %
用于从变量中检索值。
完整代码在这里:
set mon=JANFEB
set id=123
call set mmm=%%mon:~%id%,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
.
两步:
首先,id
的值被代入表达式,所以变成set mmm=%%mon:~123,3%%
然后对表达式求值 - 作为单行 "subroutine",删除 %
的一级:set mmm=%mon:~123,3%
所以,尝试将mmm
设置为mon
中第1323个字符之后的3个字符(从"character 0"开始计算)
哪个应该 "set" mon
到 nothing
(如果 id
为 3
,则 mmm
将设置为 Feb
)