如何使用 PowerShell 从 OneNote 文档中提取 headers
How do I use PowerShell to pull headers from a OneNote document
背景:
在我的工作环境中,我们的知识库笔记有一个过渡位置。这些驻留在多年来一直维护的许多 OneNote 2016 工作簿中。我目前正在将内容更新工作委派给我们的员工,这项工作的一部分涉及将我们所有的 OneNote 笔记本名称和分区名称导入 excel 电子表格以进行层次结构管理。
任务: 我花了很长时间在网上寻找一种使用 PowerShell 将层次结构信息从 OneNote 导出到 csv 的简单快捷的方法,但我一直找不到简单的方法那行得通。以下代码在互联网上引起了共鸣,但每次我尝试 运行 代码时,我都会不断出错。
$onenote = New-Object -ComObject OneNote.Application
$scope = [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages
[ref]$xml = $null
$onenote.GetHierarchy($null, $scope, $xml)
$schema = @{one=”http://schemas.microsoft.com/office/onenote/2013/onenote”}
$xpath = “//one:Notebook/one:Section”
Select-Xml -Xml (
$xml.Value) -Namespace $schema -XPath $xpath |
foreach {
$node = $psitem.Node
$npath = Split-Path -Path $node.Path -Parent
$props = [ordered]@{
Workbook = Split-Path -Path $npath -Leaf
Section = $node.Name
}
New-Object -TypeName PSObject -Property $props
}
错误:
执行此代码会得到的错误如下:
类型 "System.String" 的值到类型 "System.Xml.XmlNode"。
在 line:10 char:17
+ Select-Xml -Xml (
解法:
最后,我不得不中断与 Onenote 应用程序的已建立连接,并为 OneNote 2016 找到了一个可行的解决方案。我已经提供了我的解决方案,但很想知道将来是否有任何其他可能的方法来有效地处理这些数据:
Function Get-OneNoteHeaders{
[CmdletBinding()]
Param()
Begin
{
$onenote = New-Object -ComObject OneNote.Application
$scope = [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages
[ref]$xml = $null
$csvOutput = "c:\temp\onenote-headers.csv"
}
Process
{
$onenote.GetHierarchy($null, $scope, $xml)
[xml]$result = ($xml.Value)
Foreach($notebook in $($result.DocumentElement.Notebook)){
Add-content -Path $csvOutput -Value "$($notebook.name)"
Foreach($section in $($notebook.section)){
Add-content -Path $csvOutput -Value ",$($section.name)"
Foreach($page in $section.page){
Add-content -Path $csvOutput -Value ",,$($page.name)"
}
}
}
}
End{}
}
#Get-OneNoteHeaders
背景: 在我的工作环境中,我们的知识库笔记有一个过渡位置。这些驻留在多年来一直维护的许多 OneNote 2016 工作簿中。我目前正在将内容更新工作委派给我们的员工,这项工作的一部分涉及将我们所有的 OneNote 笔记本名称和分区名称导入 excel 电子表格以进行层次结构管理。
任务: 我花了很长时间在网上寻找一种使用 PowerShell 将层次结构信息从 OneNote 导出到 csv 的简单快捷的方法,但我一直找不到简单的方法那行得通。以下代码在互联网上引起了共鸣,但每次我尝试 运行 代码时,我都会不断出错。
$onenote = New-Object -ComObject OneNote.Application
$scope = [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages
[ref]$xml = $null
$onenote.GetHierarchy($null, $scope, $xml)
$schema = @{one=”http://schemas.microsoft.com/office/onenote/2013/onenote”}
$xpath = “//one:Notebook/one:Section”
Select-Xml -Xml (
$xml.Value) -Namespace $schema -XPath $xpath |
foreach {
$node = $psitem.Node
$npath = Split-Path -Path $node.Path -Parent
$props = [ordered]@{
Workbook = Split-Path -Path $npath -Leaf
Section = $node.Name
}
New-Object -TypeName PSObject -Property $props
}
错误: 执行此代码会得到的错误如下:
类型 "System.String" 的值到类型 "System.Xml.XmlNode"。 在 line:10 char:17 + Select-Xml -Xml (
解法: 最后,我不得不中断与 Onenote 应用程序的已建立连接,并为 OneNote 2016 找到了一个可行的解决方案。我已经提供了我的解决方案,但很想知道将来是否有任何其他可能的方法来有效地处理这些数据:
Function Get-OneNoteHeaders{
[CmdletBinding()]
Param()
Begin
{
$onenote = New-Object -ComObject OneNote.Application
$scope = [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages
[ref]$xml = $null
$csvOutput = "c:\temp\onenote-headers.csv"
}
Process
{
$onenote.GetHierarchy($null, $scope, $xml)
[xml]$result = ($xml.Value)
Foreach($notebook in $($result.DocumentElement.Notebook)){
Add-content -Path $csvOutput -Value "$($notebook.name)"
Foreach($section in $($notebook.section)){
Add-content -Path $csvOutput -Value ",$($section.name)"
Foreach($page in $section.page){
Add-content -Path $csvOutput -Value ",,$($page.name)"
}
}
}
}
End{}
}
#Get-OneNoteHeaders