Uptime в Windows (на CMD)
Я заморочился и написал uptime на чистом CMD, раз уж на PowerShell уже до меня сделали. CMD — ужасный язык программирования!
Это я после Турции до программирования дорвался. Посмотреть что получилось.
@ECHO OFF
REM Евгений Степанищев //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
Комментарии 14
systeminfo | findstr /C:"System Up Time"
systeminfo | findstr /C:"System Boot Time"
Uptime показывает сколько дней работает система. Например, у меня сейчас показывает число «10» (десять дней).
System Up Time: 61 Days, 9 Hours, 51 Minutes, 30 Seconds
В новых версиях
А вот это безобразие вместо ника Гугл выдаёт?
Комментарий для profiles.google.com/evle.zzz:
Не знаю, видимо Гугл вообще не передаёт ник.
А попробуйте сейчас написать. Я
Тест
я наверно некорректно спросил…. Выше указанный CMD скрипт не правильно определяет февраль с 29 днями, пишет 28, как можно это пофиксить, в принципе нужен не столько Uptime, сколько
Очень странно. Я специально там делал логику, чтобы правильно определялся февраль в 29 днями. Значит это глюк. Но у меня сейчас нет машин с Виндоуз, чтобы это поправить.