はじめに
Windowsが起動できないとかで通常の手順ではEdge/Chromeから
ブックマークが救出できないときに転ばぬ先の杖として書いたスクリプトです。
対象ファイル
Edge/Chromeのブックマーク情報が保存されているjson形式のファイル
- Microsoft Edge
C:\Users\*****\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks
- Google Chrome
C:\Users\*****\AppData\Local\Google\Chrome\User Data\Default\Bookmarks
つかいかた
スクリプトと同じフォルダに上記ファイルをコピーして実行すると、
Bookmarks.html
というファイルが出来上がります。
ソース
bkm2html.ps1
###############################################################################
# Edgeのブックマークデータをインポート可能なHTML形式に変換するスクリプト
###############################################################################
###############################################################################
# 定数定義 ####################################################################
# 入力ファイル
$cInFile = '.\Bookmarks'
# 出力ファイル
$cOutFile = '.\Bookmarks.html'
# HTMLヘッダ
$cHtmlHead = '<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
It will be read and overwritten.
DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>'
# 子要素ブロックヘッダ
$cLayerHead = '<DL><p>'
# 子要素ブロックフッタ
$cLayerFoot = '</DL><p>'
# データ要素ヘッダ
$cDataHead = '<DT>'
# フォルダ要素ヘッダ
$cFolderHead = '<H3 >'
# フォルダ要素フッタ
$cFolderFoot = '</H3>'
# 項目ヘッダ
$cUrlHead = '<A HREF="'
# 項目中間文字列
$cUrlMiddle = '">'
# 項目フッタ
$cUrlFoot = '</A>'
# インデントの文字数
$cIndentSize = 4
###############################################################################
# グローバル変数定義 ##########################################################
# ソースとなるJSONデータ(PSCustomObject)
$json = Get-Content -Path $cInFile -Encoding UTF8 | ConvertFrom-Json
# 出力するHTML文字列を格納するStringBuilderオブジェクト
$html = New-Object System.Text.StringBuilder
###############################################################################
# 関数定義 ####################################################################
# 再帰的にJSONデータをスキャンしHTML文字列を作成する
function json2html([object]$obj,[int]$indent = 0){
foreach($o in $obj){
$istr = ' ' * ($indent * $cIndentSize)
switch($o.type){
'folder'{
$html.AppendLine(
"${istr}${cDataHead}${cFolderHead}$($o.name)${cFolderFoot}"
) > $null
$html.AppendLine("${istr}${cLayerHead}") > $null
$html.Append((json2html $o.children ($indent + 1))) > $null
$html.AppendLine("${istr}${cLayerFoot}") > $null
}
'url'{
$html.AppendLine(
"${istr}${cDataHead}${cUrlHead}$($o.url)${cUrlMiddle}$($o.name)${cUrlFoot}"
) > $null
}
}
}
}
###############################################################################
# エントリポイント ############################################################
# HTMLヘッダ部書き込み
$html.AppendLine($cHtmlHead) > $null
# JSONデータ書き込み
json2html $json.roots.bookmark_bar 1
json2html $json.roots.other
json2html $json.roots.synced
# ファイル出力(BOMなしUTF-8)
[Text.Encoding]::UTF8.GetBytes($html.ToString()) | Set-Content -Path $cOutFile -Encoding Byte