批处理文件中Call的不同用法

时间:2015-01-22 09:01:34

标签: batch-file

我被分配了解到其他人写的代码到目前为止我能在某种程度上理解但是一行导致我麻烦

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

在某种程度上,我理解call用于启动另一个batch文件但在上面的行中有变量设置为某个值,但我不确定该行是做什么的。

此外,%%如何使用%,我知道set mon=JANFEB set id=123 call set mmm=%%mon:~%id%,3%% 用于从变量中检索值。

请帮助我理解。完整的代码在这里。

{{1}}

感谢您的时间。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

两个步骤:

首先,id的值被替换为表达式,因此它变为set mmm=%%mon:~123,3%%

然后评估表达式 - 作为单行"子程序",删除一级%set mmm=%mon:~123,3%

所以,尝试将mmm设置为mon中第1323个字符后面的3个字符(从&#34开始;字符0和#34;)

应该"设置" mon nothing

(如果id3,那么mmm将设置为Feb