You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:48:06