Quanto segue è tutt'altro che perfetto. Ma è il più vicino che potrei inventare per simulare il comportamento di UNIX time
. Sono sicuro che può essere migliorato molto.
Fondamentalmente sto creando un cmdlet che riceve un blocco di script, genera un processo e utilizza GetProcessTimes
per ottenere Kernel, Utente e Tempo trascorso.
Una volta che il cmdlet viene caricato, basta invocarlo con
Measure-Time -Command {your-command} [-silent]
L'interruttore -Silent
significa nessun output generato dal comando (Ie si è interessati solo nelle misure di tempo)
Così, per esempio:
Measure-Time -Command {Get-Process;sleep -Seconds 5} -Silent
L'output generato:
01.235.164,106 mila
Kernel time : 0.6084039
User time : 0.6864044
Elapsed : 00:00:06.6144000
Ecco il cmdlet:
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class ProcessTime
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool GetProcessTimes(IntPtr handle,
out IntPtr creation,
out IntPtr exit,
out IntPtr kernel,
out IntPtr user);
}
"@
function Measure-Time
{
[CmdletBinding()]
param ([scriptblock] $Command,
[switch] $Silent = $false
)
begin
{
$creation = 0
$exit = 0
$kernel = 0
$user = 0
$psi = new-object diagnostics.ProcessStartInfo
$psi.CreateNoWindow = $true
$psi.RedirectStandardOutput = $true
$psi.FileName = "powershell.exe"
$psi.Arguments = "-command $Command"
$psi.UseShellExecute = $false
}
process
{
$proc = [diagnostics.process]::start($psi)
$buffer = $proc.StandardOutput.ReadToEnd()
if (!$Silent)
{
Write-Output $buffer
}
$proc.WaitForExit()
}
end
{
$ret = [ProcessTime]::GetProcessTimes($proc.handle,
[ref]$creation,
[ref]$exit,
[ref]$kernel,
[ref]$user
)
$kernelTime = [long]$kernel/10000000.0
$userTime = [long]$user/10000000.0
$elapsed = [datetime]::FromFileTime($exit) - [datetime]::FromFileTime($creation)
Write-Output "Kernel time : $kernelTime"
Write-Output "User time : $userTime"
Write-Output "Elapsed : $elapsed"
}
}
fonte
2014-12-03 08:50:19
Ho guardato oltre che risposta, ma era curioso di vedere se ci fosse un modo per ottenere letture separate del tempo di sistema e l'utente in contrasto con appena in tempo reale. – Code
In PowerShell è possibile reindirizzare in 'Measure-Command' ma non conosco le diverse suddivisioni in base all'ora. 'ls | Measure-Command' – Matt
In Windows, raramente c'è un motivo per distinguere tra tempo utente e ora del kernel. Probabilmente dovresti scrivere il tuo codice se vuoi farlo. –