Войти

Показать полную графическую версию : [решено] преобразование даты и получение UPTime сервера


andr_mozg
17-11-2015, 15:37
Доброго времени суток.

получаю дату LastBootUpTime вида 20150529171135.595198+180


для того чтобы получить время работы сервера необходимо видимо вычесть от текущей даты, а формат данной даты не тот.
Как красиво и правильно преобразовать и получить UPTime ?
для JS.

Спасибо

greg zakharov
17-11-2015, 16:01
andr_mozg, на JS (без WMI):(function() {
var enc, arr, i, s = '', std,
loc = {
419 : ['019', '1251'],
409 : ['009', '1252']
};

Array.prototype.to_s = function() {
var s = '';

for (var i = 0; i < this.length; i++) {
s += i === 0 ? parseInt(this[i]) + '.'
: (parseInt(this[i]) < 10 ? '0' + parseInt(this[i]) : parseInt(this[i])) + ':';
}
return s.replace(/\:$/, '');
};

with (new ActiveXObject('WScript.Shell')) {
enc = Number(RegRead('HKCU\\Control Panel\\International\\Locale'));
arr = RegRead(
'HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\' +
'PerfLib\\' + loc[enc][0] + '\\Counter'
).toArray();

for (i = 0; i < arr.length; i++) {
if (parseInt(arr[i]) === 2 || parseInt(arr[i]) === 674) {
s += '\\' + arr[i + 1];
}
}

std = Exec('cmd /c chcp');
i = std.StdOut.ReadAll().match(/\d+/);
std = Exec('cmd /q /k echo off');
std.StdIn.WriteLine('chcp ' + loc[enc][1]);
std.StdIn.WriteLine('typeperf "' + s + '" -sc 1');
std.StdIn.WriteLine('chcp ' + i + '&exit');
s = parseInt(std.StdOut.ReadAll().match(/\d+\.\d+/g)[2]);
};
WScript.echo([s / 86400, s / 3600 % 24, s % 3600 / 60, s % 60].to_s());
}());Советую еще почитать в консоли typeperf /?

P.S.Можно uptime получить и на чистом cmd:@echo off
setlocal
chcp 1251>nul
for /f "tokens=3 delims=.," %%i in (
'typeperf "\Система\Время работы системы" -sc 1^
^| findstr /rc:"\:"'
) do set "t=%%~i"
set /a "ss=t%%60", "t/=60", "mm=t%%60", "t/=60", "hh=t%%24", "dd=t/24"
if %hh% lss 10 set "hh=0%hh%"
if %mm% lss 10 set "mm=0%mm%"
if %ss% lss 10 set "ss=0%ss%"
echo:%dd%.%hh%:%mm%:%ss%
endlocal&chcp 866>nul
exit /b

andr_mozg
17-11-2015, 16:14
Спасибо, но как получить аптайм я знаю, мне нужно именно использовать то что есть.
я пользую селект WMI и иначе делать не могу.

нужно просто преобразовать то значение что описал и отнять от текущего времени.
Как примерно действовать я знаю, мне нужно получить в другом формате дату а тут проблема.

greg zakharov
17-11-2015, 16:23
мне нужно получить в другом формате дату а тут проблемаПодробнее: какая дата, какой формат? Суть задачи вроде как сводилась к получению uptime или что-то еще, что из Вас нужно клещами тянуть?

andr_mozg
17-11-2015, 16:34
Сводится к получению uptime, в часах минутах дело десятое.

получаю текущее время new Date() но отнять от него свое время я не могу формат не совпадает, вот и вся проблема.
нечего тянуть не надо два раза написал что и зачем :)

greg zakharov
17-11-2015, 16:51
получаю текущее время new Date() но отнять от него свое время я не могу формат не совпадаетТю! Только и всего то?!(function(srv) {
var e = new Enumerator(
GetObject('winmgmts:\\\\' + srv + '\\root\\CIMV2').ExecQuery(
'SELECT * FROM Win32_OperatingSystem', 'WQL', 0x10 | 0x20
)
);
var dt = new ActiveXObject('WbemScripting.SWbemDateTime');

for (; !e.atEnd(); e.moveNext()) {
dt.Value = e.item().LastBootUpTime;
}

WScript.echo(new Date() - dt.GetVarDate());
}(
WScript.Arguments.length !== 1
? (function() {
WScript.echo('An error has been occured.');
WScript.Quit(1);
}())
: WScript.Arguments.Unnamed(0)
));Покажет то, что нужно.

andr_mozg
17-11-2015, 17:11
я видимо сегодня не в ударе :)
объясняю более точно.

есть переменная LastBootUpTime ="20150529171135.595198+180"
есть вторая time = new date()

uptime = time- LastBootUpTime

но так как LastBootUpTime имеет другой формат вычесть не получится.
а надо :)))

вопрос как преобразовать переменную LastBootUpTime так что бы я смог получить разницу дат переменных
LastBootUpTime и time

селекты и активХобджекты не подходят...
переменная уже есть и вторая то же надо просто преобразовать и вычесть.
вобщем имеем что имеем без доп запросов и обработак!

вроде теперь все объяснил :)

спасибо

greg zakharov
17-11-2015, 17:19
я видимо сегодня не в удареПостом выше Вам буквально "разжевали" как превести LastBootUpTime к типу Date, чтобы можно было вычесть последний из текущей даты. Ежели Вам не по нраву ActiveXObject и SELECT, то юзайте PowerShell.$w.ConvertToDateTime(($w = gwmi Win32_OperatingSystem).LocalDateTime) - $w.ConvertToDateTime($w.LastBootUpTime)

Iska
17-11-2015, 18:28
селекты и активХобджекты не подходят... »
Простите, а как Вы тогда с Wbem работаете? Он не через Automation берётся, а откуда-то из воздуха? Что «new ActiveXObject», что «GetObject» пользуют один и тот же механизм.

greg zakharov
17-11-2015, 18:36
Iska, видать камрад через wmic извлек LastBootUpTime, а хочет его конвертануть через WSH в TimeSpan или что-то в этом роде.

Foreigner
17-11-2015, 19:25
Интересная разница:

> (get-ciminstance win32_operatingsystem).lastbootuptime

12 ноября 2015 г. 21:37:34

> (get-wmiobject win32_operatingsystem).lastbootuptime
20151112213734.494656+180

greg zakharov
17-11-2015, 19:28
Foreigner, не очень с учетом отсутсвия Get-CimInstance в PowerShell v2

Foreigner
17-11-2015, 19:40
greg zakharov, наверное в следующих версиях не будет gwmi или оформят, как псевдоним для get-ciminstance

andr_mozg
18-11-2015, 12:02
К сожалению мои ходы не всегда тривиальны и видимо я зря описываю лишние ходы вводя в заблуждение.
Как получить знаю, я ограничен в вариантах потому что тот софт в котором я все это делаю не дает мне развернуться, имею что имею, есть селект и отдельно получаю в JS значение не более, не могу преобразовать как и говорил.

Задача сводится к тому что надо правильно подставить в = new Date(year, month, date[, hours, minutes, seconds, ms] )

а у меня yyyymmddhh24 и всякая лабуда , надо просто повернуть и разделить. все ИМХО :

спасибо :)

Iska
18-11-2015, 13:01
и видимо я зря описываю лишние ходы вводя в заблуждение. »
Напротив, Вы описываете недостаточно, не то, и не так, как надо.

«тот софт» — назовите его, укажите точную версию. Может, понадобится, может — нет, но станет хотя бы понятно, с чем имеем дело. «я ограничен в вариантах» — опишите, перечислите, покажите скриншоты и т.п.

andr_mozg
18-11-2015, 13:20
я боюсь что софт не поможет но!
HP SiteScope 11.24 я настраиваю Custom WMI Monitor
Со скриншотом сложно.

P.S. опережая еще вопросы, - не курю :)

andr_mozg
18-11-2015, 15:53
Всем спасибо починил :)

использовал p.match просто указанием \d{4} \d{2} и так далее потом добавил в new Date (p[1],p[2] и т.д.)
все взлетело




© OSzone.net 2001-2012