Uptime в Windows (на CMD)

Я заморочился и написал uptime на чистом CMD, раз уж на PowerShell уже до меня сделали. CMD — ужасный язык программирования!

Это я после Турции до программирования дорвался.
@ECHO OFF
REM Евгений Степанищев http://bolknote.ru 2011/04/09

REM Здесь CALL нельзя использовать, иначе хилый CMD не выдержит и лопнет —
REM подстановки переменных через %var% и !var! хватать перестанет
FOR /F "usebackq tokens=3" %%i ^
IN (`net stats srv ^| findstr /R "[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]*"`) DO SET DATE0=%%i

SET YEAR0=%DATE0:~6%
SET MONTH0=%DATE0:~3,2%
SET DAY0=%DATE0:~0,2%

SET YEAR1=%DATE:~6%
SET MONTH1=%DATE:~3,2%
SET DAY1=%DATE:~0,2%

REM Избавляемся от ведущих нулей, иначе CMD будет считать
REM числа восьмеричными
IF %DAY0:~0,1% == 0 SET DAY0=%DAY0:~1%
IF %MONTH0:~0,1% == 0 SET MONTH0=%MONTH0:~1%
IF %DAY1:~0,1% == 0 SET DAY1=%DAY1:~1%
IF %MONTH1:~0,1% == 0 SET MONTH1=%MONTH1:~1%

SET /A SUM=%DAY1%-%DAY0%
SETLOCAL ENABLEDELAYEDEXPANSION

IF %YEAR1% == %YEAR0% (
	SET /A END=%MONTH1%-1

	FOR /L %%M IN (%MONTH0%,1,!END!) DO (
		CALL :getMonthDays %%M %YEAR0%
		SET /A SUM+=!DAYS!
	)
) ELSE (
	REM 02.2010 -> +10 months
	FOR /L %%M IN (%MONTH0%,1,12) DO (
		CALL :getMonthDays %%M %YEAR0%
		SET /A SUM+=!DAYS!
	)

	REM 02.2011 -> +2 months
	FOR /L %%M IN (1,1,%MONTH1%) DO (
		CALL :getMonthDays %%M %YEAR0%
		SET /A SUM+=!DAYS!
	)

	REM Full years
	SET /A START=%YEAR0%+1
	SET /A STOP=%YEAR1%-1

	FOR /L %%Y IN (!START!,1,!STOP!) DO (
		CALL :isLeapYear %%Y
		IF !FEB! == 29 (
			SET /A SUM+=366
		) ELSE (
			SET /A SUM+=365
		)
	)
)

ECHO %SUM%

GOTO :EOF

REM ====== Функции ==========

REM Високосный ли год?
REM isLeapYear <год>
:isLeapYear
SET /A FEB=(%1/400)*400

IF %FEB% == %1 (
	SET FEB=29
	GOTO :EOF
)

SET /A FEB=(%1/100)*100

IF %FEB% == %1 (
	SET FEB=28
	GOTO :EOF
)

SET /A FEB=(%1/4)*4

IF %FEB% == %1 (
	SET FEB=29
	GOTO :EOF
)

SET FEB=28
GOTO :EOF

REM Количество дней в месяце
REM getMonthDays <месяц> <год>

:getMonthDays
CALL :isLeapYear %2

IF %1 == 2 (
	SET DAYS=%FEB%
	GOTO :EOF
)

IF /I %1 LSS 8 (
	SET DAYS=30
	SET /A DAYS+="%1&1"
) ELSE (
	SET DAYS=31
	SET /A DAYS-="%1&1"
)

GOTO :EOF
9 апреля 2011 22:53

Павел Власов (инкогнито)
10 апреля 2011, 00:57

Ад. Хуже cmd.exe из практических языков нет.

profiles.google.com/evle.zzz (profiles.google.com/evle.zzz)
10 апреля 2011, 10:10

Как минимум до 2003 сервера (в висте и 7 не проверял, нет под рукой, в 2008 сломали, но там нет особого резона писать на cmd), зависит от языка системы.
systeminfo | findstr /C:"System Up Time"

praeivis (praeivis.lt)
10 апреля 2011, 10:34, ответ предназначен profiles.google.com/evle.zzz:

в 7 это:
systeminfo | findstr /C:"System Boot Time"

bolk (bolknote.ru)
10 апреля 2011, 11:01, ответ предназначен profiles.google.com/evle.zzz:

Это не uptime, а просто время загрузки. Точно ту же информацию выдаёт «net stats srv», ещё и быстрее работает — у меня systeminfo с полминуты информацию о системе узнаёт.

Uptime показывает сколько *дней* работает система. Например, у меня сейчас показывает число «10» (десять дней).

profiles.google.com/evle.zzz (profiles.google.com/evle.zzz)
10 апреля 2011, 18:14, ответ предназначен bolk (bolknote.ru):

В XP и 2003 там именно аптайм:
System Up Time: 61 Days, 9 Hours, 51 Minutes, 30 Seconds
В новых версиях зачем-то переделали и показывается время загрузки. Потому и написал, что сломали.

А вот это безобразие вместо ника Гугл выдаёт?

bolk (bolknote.ru)
10 апреля 2011, 19:31, ответ предназначен profiles.google.com/evle.zzz:

А вот это безобразие вместо ника Гугл выдаёт?
Не знаю, видимо Гугл вообще не передаёт ник.

bolk (bolknote.ru)
10 апреля 2011, 19:46, ответ предназначен profiles.google.com/evle.zzz:

А попробуйте сейчас написать. Я кое-что попробовал изменить в авторизации.

Xavier z (profiles.google.com/evle.zzz)
10 апреля 2011, 20:07, ответ предназначен bolk (bolknote.ru):

Тест

http://orcinus.ru (инкогнито)
11 апреля 2011, 11:26

На повершеле писать интересней. Там работа с объектами происходит, а в CMD с текстовыми строками.

bolk (bolknote.ru)
11 апреля 2011, 12:25, ответ предназначен http://orcinus.ru

Это вы мне рассказываете? :) http://bolknote.ru/?powershell

Афанасий (инкогнито)
3 июня 2012, 00:20

Спасибо Автору, но заметил один глюк, скрипт вместо 29 дней показывает 28, переменная %DAYS%, где можно поправить сей момент?

bolk (bolknote.ru)
3 июня 2012, 00:50, ответ предназначен Афанасию

Да можете вставить сюда ссылку на pastebin.com.

Афанасий (инкогнито)
13 июня 2012, 18:38, ответ предназначен bolk (bolknote.ru):

я наверно некорректно спросил.... Выше указанный CMD скрипт не правильно определяет февраль с 29 днями, пишет 28, как можно это пофиксить, в принципе нужен не столько Uptime, сколько кол-во дней в текущем месяце на CMD, спасибо.

bolk (bolknote.ru)
14 июня 2012, 07:43, ответ предназначен Афанасию

Очень странно. Я специально там делал логику, чтобы правильно определялся февраль в 29 днями. Значит это глюк. Но у меня сейчас нет машин с Виндоуз, чтобы это поправить.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)