我有一个带有代码块的批处理脚本:
@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))"
背后的逻辑以及两个块之间的差异。
答案 0 :(得分:3)
3*((1%%m)%%100-1)
在此示例中, %%m
为12
,结果为
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。)