Сколько времени я провел в powershell? - PullRequest
0 голосов
/ 29 ноября 2018

Powershell, используя файл $ profile , я хочу узнать, сколько времени я трачу на powershell каждый раз, когда это происходит, распечатать его в файл.

, например

24.11.2018, 13:41 -  1 hour 23 minute 12 second
11.11.2018, 13:41 -  2 hour 3 minute 2 second
11.11.2018, 13:41 -  1 hour 43 minute 42 second
...
...

Содержимое файла с именем ps_time_history.txt показано выше.Я включил экран powershell 3 раза, и он показывает, как долго он работает.

Я написал скрипт, как показано ниже, но не могу получить решение, как хочу.

Я написал скрипт в файл $ profile , как показано ниже, но я не могу найти решение так, как я хочу.

Start-Job  -scriptblock 
{ 
  $StopWatch = New-Object -TypeName System.Diagnostics.Stopwatch
  $StopWatch.Start();

  $date=((Get-Process -Name powershell | Sort-Object StartTime | where { $_ }).StartTime | Select -Last 1);
  $id=((Get-Process -Name powershell | Sort-Object StartTime | where { $_  }).id | select -Last 1 );


  while ($StopWatch.IsRunning)
   {
      Start-Sleep -Seconds 1
      if((Get-Process -id $id -ErrorAction SilentlyContinue))
      {
        $time=[string]$StopWatch.Elapsed.Hours+":"+[string]$StopWatch.Elapsed.Minutes+":"+[string]$StopWatch.Elapsed.Seconds;
        echo  ([string]$date+" - "+$time) >> ~\Desktop\ps_time_history.txt;
      }
      else
      {  
       $StopWatch.Stop();
      }
   }
 }

Я получил дату и идентификационный номернедавно открытое приложение powershell.Таймер работает, пока включен экран powershell.Таймер должен останавливаться при выключении экрана powershell.

Сценарий, который я пишу, выполняет файл ps_time_history.txt каждую секунду.Но я этого не хочу.Пусть Пауэршелл запишет, сколько времени я потратил на его закрытие.

11/29/2018 02:23:17 - 0: 0: 1
11/29/2018 02:23:17 - 0: 0: 2
11/29/2018 02:23:17 - 0: 0: 3
11/29/2018 02:23:17 - 0: 0: 4
11/29/2018 02:23:17 - 0: 0: 5
11/29/2018 02:23:17 - 0: 0: 6
11/29/2018 02:23:17 - 0: 0: 7
11/29/2018 02:23:17 - 0: 0: 8
11/29/2018 02:23:17 - 0: 0: 9
11/29/2018 02:23:17 - 0: 0: 10
11/29/2018 02:23:17 - 0: 0: 11
11/29/2018 02:23:17 - 0: 0: 12
11/29/2018 02:23:17 - 0: 0: 13

Эта проблема кажется немного сложной.Как я могу решить эту проблему или есть более короткий путь?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Есть также некоторые встроенные журналы событий.Например, приведенный ниже код перечислит время, когда powershell был запущен / завершен в течение последних 10 минут (но он не будет захватывать выходы с помощью кнопки X)

$filter = @{ LogName='Windows Powershell'; StartTime=(get-date).AddMinutes(-10); EndTime=(Get-Date) } 
 Get-WinEvent -FilterHashtable $filter | Sort-Object TimeCreated | where {$_.id -in 400, 403}
0 голосов
/ 29 ноября 2018

Учитывая, что вы хотите записывать продолжительность сеанса с точностью до секунды, а не связываться с Stopwatch Я думаю, что было бы достаточно просто сохранить время начала сеанса и рассчитать длительность оттуда ...

$sessionStartTime = Get-Date;

Есть незначительная разница, но если вы хотите начать «подсчет» не с того момента, когда сеанс станет «доступным», а когда процесс начнется, вы можете использовать $PID автоматическую переменную чтобы получить экземпляр процесса PowerShell и сохранить его StartTime свойство ...

$sessionStartTime = Get-Process -Id $PID | Select-Object -ExpandProperty 'StartTime';

Этот полный сценарий $PROFILE работает для меня, используя событие механизма Exiting для запуска ScriptBlock по окончании сеанса:

[DateTime] $sessionStartTime = Get-Date;

Register-EngineEvent `
    -SourceIdentifier ([System.Management.Automation.PsEngineEvent]::Exiting) `
    -SupportEvent `
    -Action {
        [DateTime] $sessionExitTime = Get-Date;
        [TimeSpan] $sessionDuration = $sessionExitTime - $sessionStartTime;
        [String] $logLine = "$sessionExitTime - $sessionDuration";

        $logLine >> '~\Desktop\ps_time_history.txt';
    };

Обратите внимание, что это обрабатывает только случай ввода exit на консоли.Код регистрации не запускается при нажатии кнопки «Закрыть» («X») в окне консоли PowerShell .

При использовании форматирования по умолчанию для DateTime и TimeSpan это приводит к:

11/28/2018 18:26:48 - 00:00:03.1026319

Если вы не хотите, чтобы продолжительность включала дробные секунды, вы можете использовать custom TimeSpan formatting вот так ...

[String] $logLine = '{0:d} {0:HH\:mm\:ss} - {1:HH\:mm\:ss}' -f $sessionExitTime, $sessionDuration;
...