2015-12-02 3 views
0

я получил сценарий серии с блоком кода, как:Разница между двумя пакетными сценариями

@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))" и разницу между обоими блоками.

ответ

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

%%m является 12 в этом примере, в результате чего

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

давайте избавиться от избыточных и добавить скобках некоторые пробелы для лучшего readabiltiy:

3 * (112 %% 100) - 1 

оценивали:

3 * ( 12 ) - 1 

%% является "Модульное" Оператор - это возвращает остаток при делении первого числа через в второй (112 Модульное 100 (1 * 100) отдыхать 12) (Примечание: если вы попробуете это на командной строке, а не внутри командного файла, используйте один % только)

Это кажется смешным, но думаю, ваш номер не 12, но 09. Числа, начинающиеся с нуля, обрабатываются как восьмеричные, но 09 (восьмеричные) не являются допустимым числом, поэтому вы получите синтаксическую ошибку.

же прохождение игры с 09 вместо 12:

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

Последняя строка без трюка Modulo будет:

3 * ( 09 ) - 1 

Как 09 не является допустимым числом (нет в восьмеричном нет 9 числа), это не сработает.

+0

Большое вам спасибо! Это отличное объяснение ... :) –

0

Возможно, что обрабатываемая цифровая группа является «08» или «09».

Пакетные предполагает, что ведущий «0» означает, что следующая строка является восьмеричного не десятичного и объектов до 8 или 9, так как они не являются восьмеричными цифрами.

метода префиксы «1» amking «108» или «109», которые являются боты действительного десятичных числа, которые не начинаются «0» и, следовательно, будет интерпретироваться как десятичной.

С 100 добавляется к каждому из чисел 01..12 затем добавить 100, вам необходимо удалить, что 100, так %%100 ли это (расчет мод-100 = 1..12)

Другой способ было бы, очевидно, вычесть 100.

(предполагается, что группа является месяц. Если это * день **, как казалось бы, тот же аргумент применим, но пределы 01..31 или 1..31.)