Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] преобразование даты и получение UPTime сервера (http://forum.oszone.net/showthread.php?t=308066)

andr_mozg 17-11-2015 15:37 2575753

преобразование даты и получение UPTime сервера
 
Доброго времени суток.

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


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

Спасибо

greg zakharov 17-11-2015 16:01 2575762

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 2575765

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

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

greg zakharov 17-11-2015 16:23 2575769

Цитата:

Цитата andr_mozg
мне нужно получить в другом формате дату а тут проблема

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

andr_mozg 17-11-2015 16:34 2575771

Сводится к получению uptime, в часах минутах дело десятое.

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

greg zakharov 17-11-2015 16:51 2575775

Цитата:

Цитата andr_mozg
получаю текущее время 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 2575784

я видимо сегодня не в ударе :)
объясняю более точно.

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

uptime = time- LastBootUpTime

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

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

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

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

спасибо

greg zakharov 17-11-2015 17:19 2575786

Цитата:

Цитата andr_mozg
я видимо сегодня не в ударе

Постом выше Вам буквально "разжевали" как превести LastBootUpTime к типу Date, чтобы можно было вычесть последний из текущей даты. Ежели Вам не по нраву ActiveXObject и SELECT, то юзайте PowerShell.
Код:

$w.ConvertToDateTime(($w = gwmi Win32_OperatingSystem).LocalDateTime) - $w.ConvertToDateTime($w.LastBootUpTime)

Iska 17-11-2015 18:28 2575805

Цитата:

Цитата andr_mozg
селекты и активХобджекты не подходят... »

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

greg zakharov 17-11-2015 18:36 2575807

Iska, видать камрад через wmic извлек LastBootUpTime, а хочет его конвертануть через WSH в TimeSpan или что-то в этом роде.

Foreigner 17-11-2015 19:25 2575827

Интересная разница:
Код:

> (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 2575828

Foreigner, не очень с учетом отсутсвия Get-CimInstance в PowerShell v2

Foreigner 17-11-2015 19:40 2575836

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

andr_mozg 18-11-2015 12:02 2576103

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

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

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

спасибо :)

Iska 18-11-2015 13:01 2576127

Цитата:

Цитата andr_mozg
и видимо я зря описываю лишние ходы вводя в заблуждение. »

Напротив, Вы описываете недостаточно, не то, и не так, как надо.

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

andr_mozg 18-11-2015 13:20 2576132

я боюсь что софт не поможет но!
HP SiteScope 11.24 я настраиваю Custom WMI Monitor
Со скриншотом сложно.

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

andr_mozg 18-11-2015 15:53 2576177

Всем спасибо починил :)

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


Время: 14:55.

Время: 14:55.
© OSzone.net 2001-