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

如何用PowerShell为Microsoft Edge书签栏添加书签小工具?及相关疑问

用PowerShell为Microsoft Edge书签栏添加书签的正确实现

需求:通过PowerShell向Microsoft Edge的书签栏添加书签,已尝试读取并修改Edge的Bookmarks JSON文件,但不清楚如何正确构造新书签对象$newbk,也不确定是否需要重新计算$bk.checksum。

现有尝试的代码片段:

$bk=Get-Content "$env:APPDATA\..\Local\Microsoft\Edge\User Data\Default\Bookmarks"  | ConvertFrom-Json
$bk.roots.bookmark_bar.children += $newbk
$bk | ConvertTo-Json | Add-Content  "$env:APPDATA\..\Local\Microsoft\Edge\User Data\Default\Bookmarks"

现有书签属性示例:

$bk.roots.bookmark_bar.children[0]
 
date_added     : 13301408662223632
date_last_used : 0
guid           : d9ab901f-c7b2-4daa-8f22-31147db571ac
id             : 7
name           : Microsoft – Cloud, Computers, Apps & Gaming
show_icon      : False
source         : user_copy
type           : url
url            : https://www.microsoft.com/en-us

一、正确构造$newbk对象

新书签需要包含所有必填属性,每个字段的说明和生成方式:

  • date_added:Edge使用从1601年1月1日UTC开始计算的微秒数,可通过以下代码生成当前时间对应数值:
    $dateAdded = [Math]::Floor((Get-Date).ToUniversalTime() - (Get-Date "1601-01-01")).TotalMicroseconds
    
  • date_last_used:设为0即可(表示未使用过)
  • guid:生成唯一GUID字符串,用[guid]::NewGuid().ToString()
  • id:需比现有书签中最大的id值大1,可通过($bk.roots.bookmark_bar.children.id | Measure-Object -Maximum).Maximum + 1获取
  • name:书签显示的自定义名称
  • show_icon:设为$false(默认不显示自定义图标)
  • source:设为"user_copy"(与现有书签保持一致)
  • type:设为"url"(若是文件夹则为"folder")
  • url:书签对应的目标网址

示例构造代码:

# 生成新书签的必填属性
$maxId = ($bk.roots.bookmark_bar.children.id | Measure-Object -Maximum).Maximum + 1
$newbk = [PSCustomObject]@{
    date_added     = [Math]::Floor((Get-Date).ToUniversalTime() - (Get-Date "1601-01-01")).TotalMicroseconds
    date_last_used = 0
    guid           = [guid]::NewGuid().ToString()
    id             = $maxId
    name           = "我的新书签"
    show_icon      = $false
    source         = "user_copy"
    type           = "url"
    url            = "https://example.com"
}

二、必须重新计算checksum

Edge会通过checksum校验Bookmarks文件的完整性,若不更新该值,下次启动Edge时会自动重置Bookmarks文件,导致添加的书签丢失。

计算步骤:

  1. 移除原对象中的checksum属性
  2. 将剩余内容转换为排序键且无空格的JSON字符串
  3. 对该字符串计算SHA1哈希,再转换为小写十六进制字符串作为新的checksum

实现代码:

# 移除原checksum
$bk.PSObject.Properties.Remove("checksum")

# 转换为排序键、无空格的JSON
$jsonString = $bk | ConvertTo-Json -Depth 10 -Compress

# 计算SHA1哈希作为新checksum
$sha1 = [System.Security.Cryptography.SHA1]::Create()
$hashBytes = $sha1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($jsonString))
$newChecksum = [System.BitConverter]::ToString($hashBytes).Replace("-", "").ToLower()

# 添加新checksum到对象
$bk | Add-Member -MemberType NoteProperty -Name "checksum" -Value $newChecksum

三、完整可运行脚本

注意:运行前必须关闭所有Edge窗口,否则Bookmarks文件会被锁定无法写入。

# 定义Edge书签文件路径
$bookmarkPath = Join-Path $env:LOCALAPPDATA "Microsoft\Edge\User Data\Default\Bookmarks"

# 读取并解析书签文件
$bk = Get-Content $bookmarkPath -Raw | ConvertFrom-Json

# 构造新书签对象
$maxId = ($bk.roots.bookmark_bar.children.id | Measure-Object -Maximum).Maximum + 1
$newbk = [PSCustomObject]@{
    date_added     = [Math]::Floor((Get-Date).ToUniversalTime() - (Get-Date "1601-01-01")).TotalMicroseconds
    date_last_used = 0
    guid           = [guid]::NewGuid().ToString()
    id             = $maxId
    name           = "我的新书签"
    show_icon      = $false
    source         = "user_copy"
    type           = "url"
    url            = "https://example.com"
}

# 将新书签添加到书签栏
$bk.roots.bookmark_bar.children += $newbk

# 重新计算checksum
$bk.PSObject.Properties.Remove("checksum")
$jsonString = $bk | ConvertTo-Json -Depth 10 -Compress
$sha1 = [System.Security.Cryptography.SHA1]::Create()
$hashBytes = $sha1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($jsonString))
$newChecksum = [System.BitConverter]::ToString($hashBytes).Replace("-", "").ToLower()
$bk | Add-Member -MemberType NoteProperty -Name "checksum" -Value $newChecksum

# 将修改后的内容写回书签文件(覆盖原文件)
$bk | ConvertTo-Json -Depth 10 | Set-Content $bookmarkPath -Encoding UTF8

内容的提问来源于stack exchange,提问作者antonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:45