如何用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文件,导致添加的书签丢失。
计算步骤:
- 移除原对象中的
checksum属性 - 将剩余内容转换为排序键且无空格的JSON字符串
- 对该字符串计算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
相关产品推荐
相关产品推荐

