Here is a small bit of PowerShell that monitors the memory usage of a process and outputs the results in a CSV format in the locale of your choosing. I needed this because the sysadmins disabled perfmon and I really wanted to import the raw data into Excel to produce some graphs.
You can use it as follows
PS> Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
PS> Monitor-Process -Interval 30 -Locale 'nl-NL' -ProcessName winword | Tee-Object -Append -FilePath C:\Temp\test.txt
-OR-
PS> Monitor-Process -Interval 30 -Locale 'nl-NL' -ProcessId 5800 | Tee-Object -Append -FilePath C:\Temp\test.txt
function Format-MemoryAsCSV
{
[CmdletBinding(SupportsShouldProcess=$false)]
param
(
[Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, HelpMessage="Proces to get/format memory from")]
[Alias("Process")] [ValidateNotNull()]
$InputObject,
[Parameter(Mandatory=$false, HelpMessage="Which locale to use when formatting numbers (en-US, nl-NL")]
$Locale = [System.Threading.Thread]::CurrentThread.CurrentCulture.Name
)
process
{
$localeObject = new-object CultureInfo($Locale)
$Separator = $localeObject.TextInfo.ListSeparator
$item = Get-Item $InputObject -ErrorAction SilentlyContinue
$PrivateMemorySize64 = [math]::round($_.PrivateMemorySize64/ 1MB,1).ToString($localeObject ) #Total amount of memory allocated to proces. I.e.. RAM + pagefile. Excludes sharedlibs
$VirtualMemorySize64 = [math]::round($_.VirtualMemorySize64/ 1MB,1).ToString($localeObject ) #total virtual address space of the process
$WorkingSet64 = [math]::round($_.WorkingSet64/ 1MB,1).ToString($localeObject ) #Amount of memory thats held in physical RAM chips
Write-Output "$([DateTime]::Now.ToString($localeObject))$($Separator)$($_.Id)$($Separator)$($_.Name)$($Separator)$($PrivateMemorySize64)$($Separator)$($VirtualMemorySize64)$($Separator)$($WorkingSet64)"
}
}
function Monitor-Process
{
[CmdletBinding(SupportsShouldProcess=$false)]
param
(
[Parameter(Mandatory=$false, HelpMessage="NUmber of seconds between samples")]
$Interval = 30,
[Parameter(Mandatory=$false, HelpMessage="Which locale to use when formatting numbers (en-US, nl-NL")]
$Locale = [System.Threading.Thread]::CurrentThread.CurrentCulture.Name,
[Parameter(parametersetname="ByName")]
[Parameter( Mandatory=$false, HelpMessage="Name of the process(es) to monitor")]
$ProcessName,
[Parameter(parametersetname="ByPID")]
[Parameter(Mandatory=$false, HelpMessage="PID of the process to monitor")]
$ProcessId
)
process
{
do
{
switch ($PsCmdlet.ParameterSetName)
{
"ByName" { Get-Process -Name $ProcessName -ErrorAction SilentlyContinue | Format-MemoryAsCSV -Locale $Locale }
"ByPID" { Get-Process -Id $ProcessId -ErrorAction SilentlyContinue | Format-MemoryAsCSV -Locale $Locale }
}
[System.Threading.Thread]::Sleep(1000 * $Interval)
} while ($true)
}
}