Привіт.
Іноді я маю потребу експортувати з закладок web-браузера тільки одну папку, щоб перекинути її в інший браузер.
Нажаль Chrome не має такої опції. Він експортує ВСІ закладки в один html-файл. Або можно "позичити" те саме одним файлом Bookmarks у json-форматі. Але, знову ж таки, будемо мати ВСІ закладки разом.
А потім копіпастом вирізати собі потрібне. Але якщо таке трапляється часто то варто автоматизувати такі рухи.
Тоді я за допомогою ChatGPT зробив це так:
<#
Export bookmarks folder by NAME from HTML (Netscape format)
Works with exported bookmarks.html from any Chromium browser
#>
# ================== НАСТРОЙКИ ==================
# копія Bookmarks
$BookmarksHtml = "C:\tmp\Bookmarks.html"
# ІМ'Я папки, яку шукаємо
$FolderName = "MyFolder"
# куди експортувати HTML
$OutputHtml = "c:\tmp\$FolderName-bookmarks.html"
# ---------- перевірка ----------
if (-not (Test-Path $BookmarksHtml)) {
Write-Host "❌ Файл не знайдено: "
return
}
# ---------- створюємо DOM через COM ----------
$ie = New-Object -ComObject "HTMLFile"
$htmlContent = Get-Content $BookmarksHtml -Raw
$ie.IHTMLDocument2_write($htmlContent)
$ie.close()
# ---------- рекурсивна функція для пошуку папки за H3 ----------
function Find-FolderByNameHtml {
param (
$ParentNode,
[string]$Name
)
foreach ($child in $ParentNode.children) {
if ($child.tagName -eq "DT") {
# перевіряємо чи всередині є H3
$h3 = $child.getElementsByTagName("H3") | Select-Object -First 1
if ($h3 -and $h3.innerText -eq $Name) {
# знайшли потрібну папку — повертаємо DT
return $child
}
# якщо є DL всередині, рекурсивно йдемо далі
$dl = $child.getElementsByTagName("DL") | Select-Object -First 1
if ($dl) {
$found = Find-FolderByNameHtml -ParentNode $dl -Name $Name
if ($found) { return $found }
}
}
elseif ($child.tagName -eq "DL") {
$found = Find-FolderByNameHtml -ParentNode $child -Name $Name
if ($found) { return $found }
}
}
return $null
}
# ---------- старт пошуку з BODY ----------
$body = $ie.body
$folderDT = Find-FolderByNameHtml -ParentNode $body -Name $FolderName
if (-not $folderDT) {
Write-Host "❌ Папку '$FolderName' не знайдено"
return
}
# ---------- генеруємо новий HTML ----------
$dl = $folderDT.getElementsByTagName("DL") | Select-Object -First 1
$h3 = $folderDT.getElementsByTagName("H3") | Select-Object -First 1
$html = @"
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
<DT><H3>$($h3.innerText)</H3>
$($dl.outerHTML)
</DL><p>
"@
$html | Out-File -Encoding UTF8 $OutputHtml
Write-Host ""
Write-Host "✅ Експорт завершено"
Write-Host "Папка: $FolderName"
Write-Host "Файл: $OutputHtml"
Write-Host ""
Або так якщо ви поцупили Bookmakrs напряму:
<#
Export bookmarks folder by NAME only
Works with copy of Chromium Bookmarks file
#>
# копія Bookmarks
$BookmarksCopy = "C:\tmp\Bookmarks"
# ІМ'Я папки, яку шукаємо
$FolderName = "MyFolder"
# куди експортувати HTML
$OutputHtml = "c:\tmp\$FolderName-bookmarks.html"
# ---------- перевірки ----------
if (-not (Test-Path $BookmarksCopy)) {
Write-Host "❌ Файл не знайдено: $BookmarksCopy"
return
}
try {
$json = Get-Content $BookmarksCopy -Raw | ConvertFrom-Json
}
catch {
Write-Host "❌ Неможливо прочитати JSON"
return
}
# ---------- рекурсивний пошук папки по name ----------
function Find-FolderByName {
param (
$Node,
[string]$Name
)
if ($Node.type -eq "folder" -and $Node.name -eq $Name) {
return $Node
}
if ($Node.children) {
foreach ($child in $Node.children) {
$found = Find-FolderByName -Node $child -Name $Name
if ($found) { return $found }
}
}
return $null
}
# ---------- пошук у всіх коренях ----------
$roots = @(
$json.roots.bookmark_bar,
$json.roots.other,
$json.roots.synced
)
$folder = $null
foreach ($root in $roots) {
$folder = Find-FolderByName -Node $root -Name $FolderName
if ($folder) { break }
}
if (-not $folder) {
Write-Host "❌ Папку '$FolderName' не знайдено"
return
}
# ---------- HTML експорт ----------
function Export-ToHtml {
param (
$Node,
[int]$Indent = 1
)
$space = " " * $Indent
$html = ""
if ($Node.type -eq "folder") {
$html += "$space<DT><H3>$($Node.name)</H3>`n"
$html += "$space<DL><p>`n"
foreach ($child in $Node.children) {
$html += Export-ToHtml -Node $child -Indent ($Indent + 1)
}
$html += "$space</DL><p>`n"
}
elseif ($Node.type -eq "url") {
$html += "$space<DT><A HREF=""$($Node.url)"">$($Node.name)</A>`n"
}
return $html
}
# ---------- фінальний HTML ----------
$html = @"
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
$(Export-ToHtml -Node $folder)
</DL><p>
"@
$html | Out-File -Encoding UTF8 $OutputHtml
Write-Host ""
Write-Host "✅ Експорт завершено"
Write-Host "Папка: $FolderName"
Write-Host "Файл: $OutputHtml"
Write-Host ""
Щасти.

No comments:
Post a Comment
А что вы думаете по этому поводу?