我在 powershell 上花了多少时间?
How much time did I spend at powershell?
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 应用程序的日期和 ID 号。
只要 powershell 屏幕处于打开状态,计时器就会 运行。
powershell 屏幕关闭时需要停止计时器。
我正在编写的脚本每秒执行一次 ps_time_history.txt 文件。
但我不想那样。
让Powershell写下我关闭的时候用了多少时间
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
这个问题好像有点复杂。
我该如何解决这个问题或者有更短的方法吗?
考虑到您想以秒精度记录会话持续时间,而不是弄乱 Stopwatch
我认为只需存储会话开始时间并从那里计算持续时间就足够了。 .
$sessionStartTime = Get-Date;
差异可以忽略不计,但是如果您想要 "counting" 不是从会话变为 "available" 而是进程开始时开始,您可以使用 $PID
automatic variable to get the PowerShell process instance and save its StartTime
属性...
$sessionStartTime = Get-Process -Id $PID | Select-Object -ExpandProperty 'StartTime';
这个完整的 $PROFILE
脚本对我有用,在会话结束时使用 Exiting
engine event 到 运行 和 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
的情况。日志代码不是 运行 when clicking the Close ("X") button on the PowerShell console window.
使用 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;
还有一些内置的事件日志。例如,下面的代码将列出过去 10 分钟内 powershell started/exited 的时间(但它不会捕获使用 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}
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 应用程序的日期和 ID 号。 只要 powershell 屏幕处于打开状态,计时器就会 运行。 powershell 屏幕关闭时需要停止计时器。
我正在编写的脚本每秒执行一次 ps_time_history.txt 文件。 但我不想那样。 让Powershell写下我关闭的时候用了多少时间
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
这个问题好像有点复杂。 我该如何解决这个问题或者有更短的方法吗?
考虑到您想以秒精度记录会话持续时间,而不是弄乱 Stopwatch
我认为只需存储会话开始时间并从那里计算持续时间就足够了。 .
$sessionStartTime = Get-Date;
差异可以忽略不计,但是如果您想要 "counting" 不是从会话变为 "available" 而是进程开始时开始,您可以使用 $PID
automatic variable to get the PowerShell process instance and save its StartTime
属性...
$sessionStartTime = Get-Process -Id $PID | Select-Object -ExpandProperty 'StartTime';
这个完整的 $PROFILE
脚本对我有用,在会话结束时使用 Exiting
engine event 到 运行 和 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
的情况。日志代码不是 运行 when clicking the Close ("X") button on the PowerShell console window.
使用 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;
还有一些内置的事件日志。例如,下面的代码将列出过去 10 分钟内 powershell started/exited 的时间(但它不会捕获使用 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}