Экземпляры [System.Diagnostics.Process]
, возвращаемые Get-Process
, представляют собой live объекты , что означает, что их свойства отражают состояние процесса во время вызова . [1]
Таким образом, предполагая, что набор процессов wscript
не изменился между вашими вызовами Get-Process
, вы получите объекты, которые указывают на такие же процессы и их свойства возвращают те же самые значения, а именно тогдашние текущие значения, такие как процессорное время, использованное до сих пор.
Чтобы избежать этого, необходимо сделать снимок интересующих значений , что проще всего сделать , создав [pscustomobject]
клонов объектов процесса с помощью Select-Object
$prev = Get-Process -Name "wscript" | Select-Object *
Обратите внимание, что это клоны все публичные свойства; для повышения производительности вы можете просто клонировать интересующие вас значения, скажем, Select-Object Id, Name, CPU
.
Также обратите внимание, как я избавился от необходимости Where-Object
, учитывая, что вы можете просто найти процессы с заданным именем с помощью Get-Process -Name
.
Чтобы рассчитать разницу в потребляемом времени процессора, вы можете использовать следующий подход:
# Get the processes...
$processes = Get-Process "wscript"
# ... and create snapshot objects for them.
$processesSnapshot = $processes | Select-Object *
start-sleep -Seconds 30
# Create objects that contain the delta (difference) in CPU
# time elapsed, by comparing the .CPU values from the live objects
# to that of the snapshots.
$i = 0
$CpuDeltas = foreach ($process in $processes) {
$processSnapshot = $processesSnapshot[$i++]
# Clone the snapshot object and add a property reflecting the CPU-consumption
# delta and output it.
$processSnapshot | Select-Object *, @{ n='CpuDelta'; e={ $process.CPU - $_.CPU } }
}
# Output for display.
$CpuDeltas | Format-Table Id, Name, CpuDelta
[1] Некоторые свойства, такие как .MainWindowTitle
, кэшируются и требуют вызова метода .Refresh()
для отражения текущего значения.