两个批处理脚本之间的区别

时间:2015-12-02 11:01:20

标签: batch-file cmd

我有一个带有代码块的批处理脚本:

@echo off
setlocal EnableDelayedExpansion
rem US locale, ie: 'Thu 12/02/2015'
for /F "tokens=2 delims=/ " %%m in ("%date%") do set /A "n=(3*((1%%m)%%100-1))"
echo %n%
pause

当我试图理解它时,我自己写了:

@echo off
setlocal EnableDelayedExpansion
rem US locale, ie: 'Thu 12/02/2015'
for /F "tokens=2 delims=/ " %%m in ("%date%") do set /A "n=3*(%%m-1)"
echo %n%
pause

由于两者都返回33作为输出,任何人都可以帮助我理解"n=(3*((1%%m)%%100-1))"背后的逻辑以及两个块之间的差异。

2 个答案:

答案 0 :(得分:3)

3*((1%%m)%%100-1)
在此示例中,

%%m12,结果为

3*((112)%%100-1)

让我们摆脱冗余的parantheses并添加一些空间以获得更好的可读性:

3 * ( 112 %% 100 ) - 1

评价:

3 * (     12     ) - 1

%%是" Modulo"运算符 - 当第一个数字除以第二个数字时(112模数100为(1 * 100)其余12),它会返回其余数据(注意:如果您在命令行上而不是在批处理文件中尝试此操作,请使用单个{{1只有)

这似乎很荒谬,但请注意,您的号码不是%,而是12。以Zero开头的数字作为八进制处理,但09(八进制)不是有效数字,因此您将收到语法错误。

使用09代替09进行相同的演练:

12

没有Modulo技巧的最后一行是:

3*((109)%%100-1)
3 * ( 109 %% 100 ) - 1
3 * (      9     ) - 1

由于3 * ( 09 ) - 1 不是有效数字(八进制数字中没有09),所以这不起作用。

答案 1 :(得分:0)

正在处理的数字组可能是“08”或“09”。

批处理假设前导“0”表示以下字符串八进制而不是十进制,对象为8或9,因为它们不是八进制数字。

该方法前缀为“1”amking“108”或“109”,它们是机器人有效的十进制数字,不会以“0”开头,因此将被解释为十进制

由于每个数字01..12都添加了100,然后你添加100,你需要删除100,所以%%100会这样做(计算mod-100 = 1..12)

另一种方法是减去100,显然。

(假设该组是。如果它是* * **,则会出现相同的参数,但限制为01..31或1..31。)