1 (изменено: smaharbA, 2011-06-21 10:02:39)

Тема: CMD/BAT: Определение количества дней в феврале

Без привлечения утилит, даже типа forfiles

Варианты

@echo off

set year=2008
set old=%date%
set feb=28
echo. | date 29.02.%year% > nul 2>&1 && set feb=29
echo. | date %old% > nul 2>&1
echo В феврале %year% - %feb% дней
pause

Но тут проблема, только админ

@echo off

set year=2008
set old=%date%
set feb=28
echo. | date 29.02.%year% 2>&1 | findstr /r /c:":[\t ]*$" > nul || set feb=29
echo. | date %old% > nul 2>&1
echo В феврале %year% - %feb% дней
pause
exit /b

тут уже как бы и без прав, но хотелось не дергать дату

Я конечно далек от мысли... (с)

2

Re: CMD/BAT: Определение количества дней в феврале

Да еще вариант, без дергания даты

@echo off

set year=2008
set old=%date%
set feb=28
xcopy /d:02-29-%year% 2>&1 | findstr "02-29-%year%" > nul || set feb=29
echo В феврале %year% - %feb% дней
pause
exit /b
Я конечно далек от мысли... (с)

3

Re: CMD/BAT: Определение количества дней в феврале

Вариант с XCOPY вроде бы хорош, но до того момента пока в текущий каталог не попадется файл, с датой за 29-02-xxxx или позднее. Можно было бы привлечь сторонний язык, например JScript.

А чем Вам не нравится классический алгоритм вычисления високосного года?

( 2 * b ) || ! ( 2 * b )

4 (изменено: smaharbA, 2011-06-21 11:36:15)

Re: CMD/BAT: Определение количества дней в феврале

xcopy можно и nul задействовать, да и в примере специально не все параметры переданы, так не будет копировать ни при наличии ни при отсутствии файлов

вариант с вычислением конечно, то же вариант, но не все так просто, как деление на 400, 100 и 4, еще и 128 и еще есть отклонения
для практического конечно достаточно, но думается может еще варианты предложит кто.

Я конечно далек от мысли... (с)

5 (изменено: Rumata, 2011-06-21 12:41:56)

Re: CMD/BAT: Определение количества дней в феврале

В большинстве языков используется именно этот способ проверки високосного года - деление на 4, 100, 400.

Вот мой извращенный способ с вычислением на JScript:

@set @x=0 /*!
@set @x=
@echo off

cscript //nologo //e:javascript "%~dpnx0" "%~1" && (
    echo Обычный 
) || (
    echo Високосный
)

goto :eof */

var y = WScript.Arguments.length ? WScript.Arguments.item(0) : (new Date()).getFullYear();
var d = (new Date(y, 1, 29)).getDate();
var q = Number(d == 29);

WScript.Quit(q);

Суть извращения:
Один файл содержит два скрипта, написанные на разных языках - пакетный и JScript. "Внешний" пакетный скрипт вызывает "внутрениий" скрипт и передает номер года. "Внутренний" скрипт вычисляет 29 февраля для указанного года, сравнивает полученный день месяца с числом 29 и выставляет код возврата. Если день равен 29, значит год - високосный, соответственно, код возврата 1, иначе - 0. Далее "внешний" скрипт проверяет код возврата и выполняет соответствующие действия.

( 2 * b ) || ! ( 2 * b )

6 (изменено: smaharbA, 2011-06-21 13:02:01)

Re: CMD/BAT: Определение количества дней в феврале

можно не объяснять про содержимое, не то, интересно средствами командного интерпретатора

конечно так же вариант, но подобное было отброшено на этапе идеи

Я конечно далек от мысли... (с)

7 (изменено: Arigato, 2012-12-16 21:48:41)

Re: CMD/BAT: Определение количества дней в феврале

Если батник не предполагается использовать более 400 лет, то пойдет вариант с проверкой на делимость года на 4. Всякие 100, 400 и прочие поправки ни к чему.