如何使用 PowerShell 查找所有 Confluence 页面
How to find all Confluence pages with PowerShell
我试图在我的实例中提取 所有 个自 21 年 1 月 1 日以来未修改过的 Confluence 页面。我能够相当轻松地获得自 21 年 1 月 1 日以来未修改过的所有父页面。但是,我现在正在尝试获取所有 child 页面。
我知道 get-confluencechildpage
有一个 -recurse
选项 (source) 但是当我使用它时我得到 Invoke-Method : Page children is currently only supported for direct children
.
我创建了一个脚本,它将遍历顶级页面并检查是否有子页面。我想不通的是如何设置 do until 而不是复制子页面输出,请参见下图。
这是我目前所拥有的。一旦我弄清楚 get-confluencechildpage
,我就可以添加一个 if 并将其基于修改日期。有人能指出我正确的方向吗?请谢谢。
$Pages = get-confluencespace -spacekey 'SPACEKEY' | get-confluencepage
$NotMod = $pages | ? { $_.version.when -lt (get-date 1/1/21) }
$full = @()
foreach ( in $notmod) {
$full += get-confluencepage .id
if ( | Get-ConfluenceChildPage) {
$Descendents = | Get-ConfluenceChildPage
foreach ($child in $Descendents) {
$full += $child
do {
$Next = 1
$Next = $child | Get-ConfluenceChildPage
if ($next) {
$full += $next
}
} until (
$null -eq $Next
)
}
}
}
我刚刚在 self-hosted Confluence 实例 (v7.3.5) 和 Get-ConfluencePage
cmdlet 上测试了 Atlassian 的 ConfluencePS
模块 (v2.5.1)出现 到 return 给定 space.
的整个文档树的扁平化列表
基于此,您的代码将只是:
# get all pages from a Confluence "Space"
$all_pages = Get-ConfluencePage -SpaceKey "myspacekey";
# filter all the pages to just get those last edited before a specified date
$timestamp = (get-date -Year 2021 -Month 1 -Day 1).Date;
$filtered = $pages | where-object { $_.Version.When -lt $timestamp };
$filtered | format-table "Id"
ID
--
17714
67261
..etc
更新
如果出于某种原因,您没有从 Get-ConfluencePage
中获取 Space return 中的所有页面,您可以对 depth-first search树中的根页面使用 Get-ConfluenceChildPage
:
# get root pages in the space
$rootPages = ...
# push root pages onto a stack
$stack = new-object System.Collections.ArrayList;
foreach( $rootPage in $rootPages )
{
$null = $stack.Add($rootPage);
}
# initialise the result set
$all_pages = new-object System.Collections.ArrayList;
# while stack not empty
while( $stack.Count -gt 0 )
{
# pop the top page off the stack
$parent = $stack[$stack.Count - 1];
$stack.RemoveAt($stack.Count - 1);
# add the top page to the result set
$null = $all_pages.Add($parent);
# get child pages
write-host "getting child pages for '$($parent.Title)' ($($parent.ID))";
$children = Get-ConfluenceChildPage -PageId $parent.ID;
write-host ($children | format-table | out-string);
# push child pages onto the stack
foreach( $child in $children )
{
$null = $stack.Add($child);
}
}
我试图在我的实例中提取 所有 个自 21 年 1 月 1 日以来未修改过的 Confluence 页面。我能够相当轻松地获得自 21 年 1 月 1 日以来未修改过的所有父页面。但是,我现在正在尝试获取所有 child 页面。
我知道 get-confluencechildpage
有一个 -recurse
选项 (source) 但是当我使用它时我得到 Invoke-Method : Page children is currently only supported for direct children
.
我创建了一个脚本,它将遍历顶级页面并检查是否有子页面。我想不通的是如何设置 do until 而不是复制子页面输出,请参见下图。
这是我目前所拥有的。一旦我弄清楚 get-confluencechildpage
,我就可以添加一个 if 并将其基于修改日期。有人能指出我正确的方向吗?请谢谢。
$Pages = get-confluencespace -spacekey 'SPACEKEY' | get-confluencepage
$NotMod = $pages | ? { $_.version.when -lt (get-date 1/1/21) }
$full = @()
foreach ( in $notmod) {
$full += get-confluencepage .id
if ( | Get-ConfluenceChildPage) {
$Descendents = | Get-ConfluenceChildPage
foreach ($child in $Descendents) {
$full += $child
do {
$Next = 1
$Next = $child | Get-ConfluenceChildPage
if ($next) {
$full += $next
}
} until (
$null -eq $Next
)
}
}
}
我刚刚在 self-hosted Confluence 实例 (v7.3.5) 和 Get-ConfluencePage
cmdlet 上测试了 Atlassian 的 ConfluencePS
模块 (v2.5.1)出现 到 return 给定 space.
基于此,您的代码将只是:
# get all pages from a Confluence "Space"
$all_pages = Get-ConfluencePage -SpaceKey "myspacekey";
# filter all the pages to just get those last edited before a specified date
$timestamp = (get-date -Year 2021 -Month 1 -Day 1).Date;
$filtered = $pages | where-object { $_.Version.When -lt $timestamp };
$filtered | format-table "Id"
ID
--
17714
67261
..etc
更新
如果出于某种原因,您没有从 Get-ConfluencePage
中获取 Space return 中的所有页面,您可以对 depth-first search树中的根页面使用 Get-ConfluenceChildPage
:
# get root pages in the space
$rootPages = ...
# push root pages onto a stack
$stack = new-object System.Collections.ArrayList;
foreach( $rootPage in $rootPages )
{
$null = $stack.Add($rootPage);
}
# initialise the result set
$all_pages = new-object System.Collections.ArrayList;
# while stack not empty
while( $stack.Count -gt 0 )
{
# pop the top page off the stack
$parent = $stack[$stack.Count - 1];
$stack.RemoveAt($stack.Count - 1);
# add the top page to the result set
$null = $all_pages.Add($parent);
# get child pages
write-host "getting child pages for '$($parent.Title)' ($($parent.ID))";
$children = Get-ConfluenceChildPage -PageId $parent.ID;
write-host ($children | format-table | out-string);
# push child pages onto the stack
foreach( $child in $children )
{
$null = $stack.Add($child);
}
}