powershell - 如何从 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,但没有正确嵌套它们。
解决方案
您需要使用递归(如果有剩余的子项,则创建一个调用自身的函数)。
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"
推荐阅读
- javascript - 无服务器自定义授权器结果未定义
- hostname - 什么以及为什么我的 $HOSTNAME 是 hitronhub.home?
- excel - 我可以使用任何公式/方法将 A 列中的每一行与 B 列中的每一行连接起来吗?
- android - 当滚动超出最初可见的内容时,无法在回收站视图中访问文本视图
- asp.net-mvc - 如何解决“/”应用程序中的服务器错误
- python - 如何将布尔张量打包成 int32 张量的位?
- swift - 如何通过 urlsession 更新 uitableview 单元格中的进度视图(下载/上传文件)
- laravel - Azure 中托管的 Laravel Web 应用程序中的 PUT 和 DELETE 405 Method Not Allowed 错误
- javascript - 相对于父容器定位元素
- c++ - 对模板类的模糊引用 (C++)