浏览器与Windows应用原生消息通信:PowerShell脚本消息处理异常问题
浏览器与Windows应用原生消息通信:PowerShell脚本消息处理异常问题
嘿,我来帮你搞定这个浏览器和PowerShell原生消息通信的问题!你现在的需求很明确:让浏览器扩展给PowerShell脚本发不同的消息,脚本根据收到的消息返回对应的响应,但目前用Read-Host的话,脚本直接把收到的消息原封不动发回去了,完全没法区分处理不同消息,对吧?
问题出在Read-Host这个命令上——它是用来读取控制台的普通文本输入的,但浏览器和原生应用的原生消息通信是遵循固定格式的JSON流,不是简单的文本交互。原生消息的格式规则是:先发送4字节的小端序整数(表示后续JSON数据的长度),再发送JSON字符串内容。所以你得换一种方式来读取输入,才能正确解析消息并处理。
给你一套修改后的PowerShell脚本(app.ps1)代码,完美适配原生消息的格式:
# 读取原生消息的4字节长度前缀(小端序) $lengthBytes = [Console]::In.ReadBytes(4) $length = [BitConverter]::ToInt32($lengthBytes, 0) # 读取对应长度的JSON字节数据,转成字符串并解析为对象 $jsonBytes = [Console]::In.ReadBytes($length) $jsonString = [System.Text.Encoding]::UTF8.GetString($jsonBytes) $incomingMessage = ConvertFrom-Json $jsonString # 根据消息类型做不同处理,这里假设你的消息里有type字段区分类型 switch ($incomingMessage.type) { "getSystemInfo" { # 返回系统信息 $response = @{ status = "success" data = @{ osVersion = [Environment]::OSVersion.VersionString currentUser = $env:USERNAME computerName = $env:COMPUTERNAME } } } "echoContent" { # 回传收到的内容 $response = @{ status = "success" data = @{ echoedContent = $incomingMessage.content } } } default { # 处理未知消息类型 $response = @{ status = "error" message = "无法识别的消息类型" } } } # 把响应转成JSON,并按照原生消息格式发送回浏览器 $responseJson = ConvertTo-Json $response -Compress $responseBytes = [System.Text.Encoding]::UTF8.GetBytes($responseJson) # 先写4字节的长度前缀 $lengthBytes = [BitConverter]::GetBytes($responseBytes.Length) [Console]::Out.Write($lengthBytes, 0, 4) # 再写JSON内容 [Console]::Out.Write($responseJson) # 刷新输出流确保数据立刻发送 [Console]::Out.Flush()
然后你需要调整浏览器扩展里的消息发送代码,确保发送的是带类型字段的JSON对象,比如:
// 接收来自content_script的消息并转发给原生应用 chrome.runtime.onMessage.addListener((message) => { console.log("向原生应用发送消息", message); chrome.runtime.sendNativeMessage("你的原生应用ID", { type: message.type, content: message.content }, (response) => { if (chrome.runtime.lastError) { console.error("原生消息发送失败", chrome.runtime.lastError); } else { console.log("收到PowerShell响应", response); // 这里可以把响应再传给content script或者做其他业务处理 } }); });
另外还有几个要注意的细节:
- 确保你的原生应用manifest文件(比如
com.your.app.json)配置正确,指定了PowerShell脚本的绝对路径,以及允许通信的浏览器扩展ID; - PowerShell执行权限:如果脚本没法运行,可能需要临时调整执行策略,比如在管理员PowerShell里运行
Set-ExecutionPolicy RemoteSigned(操作前注意风险,用完可以改回默认策略); - 调试技巧:可以在PowerShell脚本里加日志输出到本地文件,比如
$incomingMessage | Out-File "C:\temp\native_msg_debug.log" -Append,方便查看收到的具体消息内容。
备注:内容来源于stack exchange,提问作者Sandanat
相关产品推荐
相关产品推荐

