841 字
4 分钟
PowerShell文件数量监控与进程管理脚本

PowerShell 文件数量监控与进程管理脚本#

有时候需要根据文件数量来触发某些操作,比如文件堆积过多时自动清理进程。这篇记录一个实用的 PowerShell 监控脚本。

基础版本:单次检测#

统计当前目录文件数量,等于 119 时结束所有 python 和 cmd 进程:

kill_process.ps1
# 统计当前目录下的文件数量(-File 确保只统计文件,不包括子文件夹)
# 使用 @() 强制转换为数组,确保在只有 0 或 1 个文件时 .Count 属性也能正常工作
$fileCount = @(Get-ChildItem -File).Count
if ($fileCount -eq 119) {
Write-Host "检测到文件数量为 119,正在终止 python 和 cmd 进程..." -ForegroundColor Yellow
# 使用 taskkill 强制结束进程
# /F: 强制终止进程
# /IM: 指定要终止的映像名称
# /T: 终止指定的进程及其任何子进程
# 2>$null: 隐藏找不到进程时产生的错误提示
taskkill /F /IM python.exe /T 2>$null
taskkill /F /IM cmd.exe /T 2>$null
Write-Host "操作执行完毕。" -ForegroundColor Green
} else {
Write-Host "当前文件数量为: $fileCount,未达到 119 的触发条件。" -ForegroundColor Cyan
}

循环监控版本#

每隔 1 秒检查一次,触发后自动退出:

monitor_kill.ps1
Write-Host "开始监控... 当前文件夹文件数量达到 119 时将触发操作。" -ForegroundColor Cyan
while ($true) {
# 获取当前目录下的文件数量
$fileCount = @(Get-ChildItem -File).Count
if ($fileCount -eq 119) {
Write-Host "`n[!] 触发条件达成!当前文件数量为 119。" -ForegroundColor Yellow
Write-Host "正在终止所有的 python 和 cmd 进程..." -ForegroundColor Yellow
# 强制结束进程及其子进程,隐藏未找到进程的报错
taskkill /F /IM python.exe /T 2>$null
taskkill /F /IM cmd.exe /T 2>$null
Write-Host "操作执行完毕,监控脚本现已退出。" -ForegroundColor Green
# 退出 while 循环,脚本执行结束
break
}
# 暂停 1 秒后继续下一次检查
Start-Sleep -Seconds 1
}

进阶版本:后台静默运行#

创建 .bat 文件实现双击即运行,隐藏 PowerShell 窗口:

start_monitor.bat
@echo off
:: 以隐藏窗口的方式启动 PowerShell 脚本
powershell -WindowStyle Hidden -File "monitor_kill.ps1"

或者使用 VBS 脚本实现完全静默:

start_silent.vbs
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "powershell -File monitor_kill.ps1", 0, False
Set WshShell = Nothing

关键参数说明#

taskkill 参数#

参数说明
/F强制终止进程
/IM指定映像名称(进程名)
/T终止进程及其所有子进程

PowerShell 参数#

参数说明
-File只统计文件,不包括目录
@()强制转换为数组,确保 .Count 属性可用
2>$null将错误输出重定向到空,隐藏报错

扩展功能#

监控多个条件#

Terminal window
$fileCount = @(Get-ChildItem -File).Count
$folderCount = @(Get-ChildItem -Directory).Count
$totalSize = (Get-ChildItem -File | Measure-Object -Property Length -Sum).Sum / 1MB
if ($fileCount -eq 119 -or $totalSize -gt 1000) {
Write-Host "触发清理条件" -ForegroundColor Red
# 执行清理...
}

记录日志#

Terminal window
$logFile = "monitor.log"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"[$timestamp] 当前文件数: $fileCount" | Out-File -Append $logFile

发送通知#

Terminal window
# Windows 10/11 通知
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("文件数量达到阈值!", "警告", "OK", "Warning")

安全注意事项#

风险提示
  1. 执行策略:首次运行 PowerShell 脚本可能遇到执行策略限制

    Terminal window
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  2. 自我终止:如果在 cmd 中通过 powershell -file ... 调用此脚本,杀死 cmd 进程会导致调用窗口关闭

  3. 进程影响taskkill /F 是强制终止,可能导致数据丢失,谨慎使用

参考链接#

PowerShell文件数量监控与进程管理脚本
https://im.awsl.app/posts/ai-automation/054-powershell-file-monitor/
作者
uu
发布于
2023-08-20
许可协议
CC0 1.0