如何在PowerShell中实现日志文件大小变化后自动执行鼠标点击
解决日志文件变化触发鼠标点击的PowerShell脚本
问题分析
原代码存在几个关键问题:
- 鼠标点击逻辑错误嵌入
FileSystemWatcher的属性初始化代码块,未关联到文件变化事件 - 未正确定义文件变化事件的处理脚本块
$changeAction - 缺少必要的.NET程序集加载,导致鼠标操作相关类无法正常工作
- 未正确声明鼠标点击所需的Win32 API调用
修正后的完整脚本
# 加载必要的.NET程序集 Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 声明鼠标点击所需的Win32 API Add-Type @" using System; using System.Runtime.InteropServices; public class MouseClick { [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); } "@ Function Register-LogWatcher { param ( [Parameter(Mandatory=$true)] [string]$FolderPath, [int]$ClickX = 515, [int]$ClickY = 625 ) $filter = "Process.log" # 创建文件系统监视器 $watcher = New-Object IO.FileSystemWatcher -ArgumentList $FolderPath, $filter -Property @{ IncludeSubdirectories = $false EnableRaisingEvents = $false NotifyFilter = [IO.NotifyFilters]::Size # 仅监测文件大小变化 } # 定义文件变化时的执行动作 $changeAction = { param($sender, $e) # 等待文件写入完成,避免多次触发 Start-Sleep -Milliseconds 500 # 移动鼠标到指定位置 [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($Event.MessageData.X, $Event.MessageData.Y) # 模拟鼠标左键按下和释放 [MouseClick]::mouse_event(0x0002, 0, 0, 0, 0) # 左键按下 Start-Sleep -Milliseconds 100 [MouseClick]::mouse_event(0x0004, 0, 0, 0, 0) # 左键释放 Write-Host "检测到Process.log大小变化,已执行鼠标点击操作" } # 注册文件变化事件,传递点击坐标作为消息数据 Register-ObjectEvent -InputObject $watcher -EventName "Changed" -Action $changeAction -MessageData @{X=$ClickX; Y=$ClickY} | Out-Null # 启用事件监听 $watcher.EnableRaisingEvents = $true Write-Host "日志监视器已启动,正在监测$FolderPath\$filter的大小变化..." } # 启动监视器,指定日志文件所在目录 Register-LogWatcher -FolderPath "C:\Users\User\AppData\Temp\3.0\Logs" -ClickX 515 -ClickY 625
关键修正点说明
- 加载程序集:通过
Add-Type加载System.Windows.Forms和System.Drawing,确保鼠标位置控制和点类可用 - Win32 API声明:正确引入
user32.dll的mouse_event方法,实现鼠标点击模拟 - 事件动作分离:将鼠标点击逻辑放在
Changed事件的Action脚本块中,确保仅在文件大小变化时执行 - 消息数据传递:通过
-MessageData将点击坐标传递给事件处理块,避免硬编码,提升灵活性 - 触发防抖:添加短时间延迟,避免文件写入过程中多次触发事件
内容的提问来源于stack exchange,提问作者Artem Starley
相关产品推荐
相关产品推荐

