如何使用 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);
    }

}