首页 > 解决方案 > 如何从 Internet Explorer 导出收藏夹

问题描述

我正在尝试使用 PS 将 IE11 中的收藏夹导出为单个 html 文件,包括目录结构。目的是为 Win7 上的每个用户运行此程序,以便在 Win10 中导入 Edge。

我已经使用 get-childitem 来查找文件夹和文件,但无法弄清楚如何使用适当的结构构建文件。一个文件夹用标签表示,<DL></DL>因此嵌套文件夹看起来像<DL>contents<DL>contents</DL></DL>. 我可以获得每个文件夹的名称和路径,并且可以使用 foreach 创建每个对象,但无法弄清楚如何获得正确的结构。

Get-ChildItem ("$env:userprofile\Favorites") -Directory -Recurse | ForEach {
    $foname=$_.Name
    $fopath=$_.FullName
    if(Test-Path "$fopath\*"){
        $body+="<DT><H3>$foname</H3>`n"
        $body+="<DL><p>`n"
        Get-ChildItem ("$fopath") -File | ForEach {
            $finame = $_.Name.TrimEnd(".url")
            $fiurl = ($_ | Select-String "^URL").Line.Trim("URL=")
            $body+="<DT><A HREF='$fiurl'>$finame</A>`n"
        }
        $body+="</DL><p>`n"
    }
}

我的代码创建了所需的文件夹和 url,但没有正确嵌套它们。

标签: powershell

解决方案


您需要使用递归(如果有剩余的子项,则创建一个调用自身的函数)。

function Get-Folders($path) {
    Get-ChildItem $path -Directory | % {
        "<DL>$($_.BaseName)"
        if ((Get-ChildItem $_.FullName -Directory).Count -gt 0) {
            Get-Folders $_.FullName
        }
        "</DL>"
    }
}

Get-Folders ("$env:userprofile\Favorites")

编辑:我注意到我没有完全回答您的问题(阅读速度太快)。这是代码的更直接的版本(仍然围绕递归函数构建)。它也显示文件(注意属性 .BaseName - 这是一个方便记住的属性)。

$indent = -4
function Spaces  { return " " * $indent}
function Indent  { $global:indent += 4 }
function Outdent { $global:indent -= 4 }

function Get-Folders($path) {
    Get-ChildItem $path -Directory | % {
        Indent
        "$(Spaces)<DL>"
        Indent
        "$(Spaces)$($_.BaseName)"
        if ((Get-ChildItem $_.FullName -Directory).Count -gt 0) {
            Get-Folders $_.FullName
        }

        Indent
        Get-ChildItem $_.FullName -File -Filter "*.url" | % {
            "$(Spaces)<DT>($_.BaseName)</DT>"
        }
        Outdent

        Outdent
        "$(Spaces)</DL>"
        Outdent
    }
}

Get-Folders "$env:userprofile\Favorites"

推荐阅读