Uptime в Windows (на Powershell)

Написал на PowerShell скромный аналог утилиты uptime из Линукса (эта утилита показывает сколько дней компьютер работает без перезагрузки):

[math]::round(((Get-Date) - ($os=gwmi Win32_OperatingSystem).ConvertToDateTime($os.lastbootuptime)).TotalDays, 2)

В основном в сети предлагается запустить «net stats srv» и посмотреть строку «статистика после» («statistics since»), впрочем и вариантов на PowerShell тоже хватает. Кстати, можно сделать ещё и такой вариант:

[math]::round(((Get-Date) - (((net stats srv)[3] -split ' ')[2,3] -join ' ' | Get-Date)).TotalDays, 2)

Почти LISP. И всё-таки мне очень нравится PowerShell.

13 комментариев

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 комментариев