写在前面
无聊逛论坛,看到一篇悬赏贴,要求监控Windows上软件的资源占用情况并输出日志,于是简单梳理一下思路,写了一个PowerShell脚本,满足所要求的功能。
使用方法
在代码中指定位置自行替换需要监控的进程名称、日志的保存路径、记录周期。
# 设置要监视的进程名称
$processName = "Notepad3"
# 设置日志文件的路径(CSV格式)
$logFilePath = "C:\Users\52Pojie\Desktop\ProcessMonitorLog.csv"
# 设置检查进程资源使用的间隔时间(秒)
$checkInterval = 5
日志以时间、CPU占用、内存占用为标题,文件后缀为.csv。
完整代码
# 设置要监视的进程名称
$processName = "Notepad3"
# 设置日志文件的路径(CSV格式)
$logFilePath = "C:\Users\52Pojie\Desktop\ProcessMonitorLog.csv"
# 设置检查进程资源使用的间隔时间(秒)
$checkInterval = 5
# 检查进程是否存在
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue
# 如果进程存在,开始监视
if ($process) {
Write-Host "开始监视进程:$processName"
# 创建或清空日志文件
"时间,CPU使用率,内存使用(MB)" | Out-File $logFilePath
# 监视进程资源使用的循环
while ($true) {
# 获取当前时间
$currentTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# 获取进程的CPU和内存使用情况
$cpuUsage = $process.CPU
$memoryUsage = $process.WS / 1MB
# 格式化日志信息为CSV格式
$logInfo = "$currentTime,$cpuUsage,$memoryUsage"
# 写入日志信息到CSV文件
$logInfo | Out-File $logFilePath -Append
# 输出到控制台
Write-Host $logInfo
# 等待指定的时间间隔
Start-Sleep -Seconds $checkInterval
# 检查进程是否仍然存在
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue
if (-not $process) {
Write-Host "进程 $processName 已结束。监视停止。"
break
}
}
} else {
Write-Host "未找到进程:$processName"
}
运行截图
可能会遇见的问题
- Excel打开CSV文件,所有内容都挤在一个单元格内。
解决办法:选中第一列,点击工具栏-数据-分列。
- 代码保存后运行乱码。
解决办法:将文件保存为ANSI编码。
- PowerShell提示脚本被禁止执行。
解决办法:管理员模式运行PowerShell,输入Set-ExecutionPolicy RemoteSigned ,执行命令时,系统会提示我们确认更改,输入 Y 并回车以确认。
写在最后
制作不易,请点点支持,感激不尽! : )
|