无需模拟用户输入,如何将代码注入当前PowerShell会话更新变量
解决PowerShell会话聚焦时自动刷新路径变量的方案
以下是三种无需模拟用户输入、直接向当前PowerShell会话注入刷新逻辑的可行方案:
方案1:会话内监听窗口激活事件(轻量化)
直接在当前PowerShell会话中注册窗口激活监听器,当窗口被聚焦时自动执行路径文件加载操作,无需外部工具。
实现代码
# 提前加载Windows API用于获取前台窗口句柄 Add-Type @" using System; using System.Runtime.InteropServices; public class User32 { [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); } "@ # 获取当前PowerShell窗口的句柄 $currentHwnd = (Get-Process -Id $PID).MainWindowHandle # 注册窗口激活事件监听器 Register-CimEvent -ClassName Win32_ProcessStartTrace -SourceIdentifier PSWindowActivation -Action { $activeWindow = [User32]::GetForegroundWindow() if ($activeWindow -eq $using:currentHwnd) { # 刷新全局变量LocalPaths $global:LocalPaths = Get-Content "C:\Users\...\Documents\Local_Paths.txt" Write-Host "✅ LocalPaths已刷新" -ForegroundColor Green } }
注意事项
- 该监听器会在后台持续运行,直到会话关闭或手动取消:
Unregister-Event -SourceIdentifier PSWindowActivation - 可将这段代码加入
$Profile,让会话启动时自动注册监听
方案2:命名管道实现外部触发(跨场景)
通过命名管道建立外部脚本与当前PowerShell会话的通信,配合热键工具(如AutoHotkey)触发刷新操作,无需切换到PowerShell窗口。
步骤1:在当前会话启动管道监听
$pipeName = "LocalPathsRefreshPipe" $targetFile = "C:\Users\...\Documents\Local_Paths.txt" # 创建命名管道并启动后台监听作业 Start-Job -Name PipeListener -ScriptBlock { param($pipeName, $filePath) $pipe = New-Object System.IO.Pipes.NamedPipeServerStream( $pipeName, [System.IO.Pipes.PipeDirection]::InOut, 1, [System.IO.Pipes.PipeTransmissionMode]::Message ) while ($true) { $pipe.WaitForConnection() $reader = New-Object System.IO.StreamReader($pipe) $command = $reader.ReadLine() if ($command -eq "RefreshPaths") { $global:LocalPaths = Get-Content $filePath Write-Host "✅ LocalPaths已刷新" -ForegroundColor Green } $pipe.Disconnect() } } -ArgumentList $pipeName, $targetFile
步骤2:编写触发脚本(RefreshPaths.ps1)
$pipeName = "LocalPathsRefreshPipe" try { $pipe = New-Object System.IO.Pipes.NamedPipeClientStream(".", $pipeName, [System.IO.Pipes.PipeDirection]::InOut) $pipe.Connect(1000) $writer = New-Object System.IO.StreamWriter($pipe) $writer.WriteLine("RefreshPaths") $writer.Flush() $pipe.Close() } catch { Write-Host "❌ 连接管道失败:$_" -ForegroundColor Red }
绑定热键(以AutoHotkey为例)
^!r:: ; Ctrl+Alt+R 触发刷新 Run powershell.exe -WindowStyle Hidden -File "C:\路径\到\RefreshPaths.ps1" return
方案3:AttachConsole API附着进程(无前置依赖)
通过Windows API直接附着到当前激活的PowerShell进程控制台,执行刷新命令,无需会话提前设置监听。
实现脚本(InjectRefresh.ps1)
# 加载所需Windows API Add-Type @" using System; using System.Runtime.InteropServices; public class Kernel32 { [DllImport("kernel32.dll", SetLastError = true)] public static extern bool AttachConsole(uint dwProcessId); [DllImport("kernel32.dll")] public static extern bool FreeConsole(); } public class User32 { [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); } "@ # 获取当前激活的PowerShell进程 $activeHwnd = [User32]::GetForegroundWindow() $psProcess = Get-Process | Where-Object { $_.MainWindowHandle -eq $activeHwnd -and $_.ProcessName -match "powershell|pwsh" } if ($psProcess) { # 附着到目标进程控制台 if ([Kernel32]::AttachConsole($psProcess.Id)) { # 执行刷新命令 powershell.exe -Command @" `$global:LocalPaths = Get-Content 'C:\Users\...\Documents\Local_Paths.txt' Write-Host '✅ LocalPaths已刷新' -ForegroundColor Green "@ [Kernel32]::FreeConsole() } else { Write-Host "❌ 无法附着到目标控制台" -ForegroundColor Red } } else { Write-Host "❌ 未找到激活的PowerShell窗口" -ForegroundColor Red }
使用方式
将该脚本绑定热键,聚焦PowerShell窗口后按下热键即可触发刷新。
内容的提问来源于stack exchange,提问作者hellen_dorandt89
相关产品推荐
相关产品推荐

