Руководство. Создание и анализ отчета об использовании версий для сайта SharePoint

Понимание хранилища версий на сайте позволяет лучше оптимизировать параметры журнала версий в соответствии с целями восстановления вашей организации и управлять затратами на хранение.

В этом руководстве показано, как создать отчет об использовании хранилища версий и проанализировать его, чтобы лучше понять объем хранилища версий сайта. Отчет также можно использовать для выполнения анализа "что если" применения различных ограничений версий или обрезки существующих версий.

В этом руководстве рассматриваются следующие действия:

  • Создание файла отчета об использовании хранилища версий для сайта или библиотеки.
  • Проверьте ход создания отчета.
  • Общие сведения о файле отчета.
  • Анализ использования хранилища версий с помощью Excel или PowerShell.

В последующих руководствах вы узнаете, как можно выполнить анализ влияния на созданный отчет CSV.

Подготовка к работе

  1. Определите сайт SharePoint, учетную запись OneDrive или библиотеку документов, использование хранилища версий которых вы хотите узнать.
  2. Выберите расположение в библиотеке документов SharePoint, в которое вы хотите сохранить отчет.
  3. Скачайте последнюю версию командной консоли SharePoint Online.

Примечание.

  1. Файл отчета создается в указанном расположении отчета.
  2. Расположение отчета должно находиться в самой библиотеке документов SharePoint.
  3. В библиотеке документов не может быть файл с тем же именем, что и у отчета.

Создание отчета об использовании версий для сайтов или библиотеки

Вы можете создать отчет о текущем хранилище версий, используемом на сайте, выполнив New-SPOSiteFileVersionExpirationReportJob команду или в библиотеке New-SPOListFileVersionBatchDeleteJob , выполнив команду .

В следующем примере задание помещается в очередь для создания отчета на уровне сайта в расположении https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csvотчета .

New-SPOSiteFileVersionExpirationReportJob -Identity https://contoso.sharepoint.com/sites/site1 -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"  

В следующем примере задание помещается в очередь для создания отчета с областью библиотеки в расположении отчета . https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv

New-SPOListFileVersionExpirationReportJob -Site https://contoso.sharepoint.com/sites/site1 -List "Documents" -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"

Проверка хода создания отчета

Используйте команду для Get-SPOListFileVersionExpirationReportJobProgress отслеживания хода выполнения запроса создания отчета.

В приведенном ниже примере показано, как проверка, если отчет на уровне сайта полностью заполнен и готов к анализу. 

Get-SPOSiteFileVersionExpirationReportJobProgress -Identity https://contoso.sharepoint.com/sites/site1 -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"

В приведенном ниже примере показано, как проверка, если отчет с областью библиотеки полностью заполнен и готов к анализу.  

Get-SPOListFileVersionExpirationReportJobProgress -Site https://contoso.sharepoint.com/sites/site1 -List "Documents" -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"    

Командлет вернет ответ в формате JSON. Возвращенный ответ JSON имеет ключ с именем status. Одно из следующих ожидаемых значений см. в таблице ниже.

Ответ состояния JSON Объяснение
"completed" Задание успешно завершено, и отчет полностью заполнен.
"in_progress" Активное задание. Отчет заполнен частично.
"no_report_found" Не существует активных заданий, заполняющих указанный файл.
"failed" Задание для создания отчета завершилось сбоем из-за сообщения об ошибке. Проверьте "error_message" на наличие сообщения об ошибке из-за сбоя.

Общие сведения о файле отчета о версии

Созданный отчет имеет формат CSV, каждая строка которых соответствует версии файла. Ниже приведен пример отчета об истечении срока действия версии файла и его разбивки по столбцам.

Снимок экрана: отчет об истечении срока действия.

Первая строка — это заголовок с идентификаторами столбцов, содержащими идентификаторы версий файлов, сведения о метаданных версии и метку времени окончания срока действия. Компактные столбцы обозначаются .Compact после исправления, которые не будут повторяться, если две последовательные строки имеют одинаковое значение. Другие строки представляют версии файлов, где каждая строка представляет одну версию.
Давайте рассмотрим первую версию файла, отображаемую в этом отчете.

  • Идентификаторы версий файлов: WebId, DocId, MajorVersionи MinorVersion однозначно определяют каждую версию на сайте SharePoint.

  • Идентификаторы метаданных версии:WebUrl указывает версию в https://contoso.sharepoint.comи FileUrl указывает, что файл для этой версии находится в DocLib/MyDocument.docx. Другими словами, он находится в библиотеке документов с именем DocLib, а файл находится в корневой DocLib папке и называется MyDocument.docx.

  • Size указывает, что версия занимает 92 246 байт хранилища.

  • Следующие два столбца и ModifiedBy_DisplayName указывают, ModifiedBy_UserId что пользователь Мишель Харрис (с идентификатором пользователя 6) создал эту версию.

  • LastModifiedDate указывает, что содержимое версии было изменено 13 марта 2023 года в 22:36:09 UTC. SnapshotDate Отображается, что версия стала исторической 20 марта 2023 года в 16:56:51 UTC. IsSnapshotDateEstimatedпоказывает, что SnapshotDate является фактической датой snapshot.

  • Идентификаторы расписания окончания срока действия:CurrentExpirationDate указывает, что для этой версии в настоящее время задано значение никогда не истекает. AutomaticPolicyExpirationDate показывает, что в политике автоматического истечения срока действия для этой версии также задано значение никогда не истекает. TargetExpirationDate указывает, что если мы будем следовать этому расписанию для обрезки, мы установим для этой версии никогда не истекает.

Примечание.

Версии файлов, хранящиеся в архивной библиотеке, также будут включены в этот отчет.

Рассмотрим третью версию.

WebId Значения и DocId пусты, так как эти столбцы являются компактными столбцами, обозначаемыми . Компактные после исправления, это означает, что они должны иметь значения. Если мы ищем последнюю непустую над этой строкой, мы найдем WebId как 4c7a58c1-01f2-4fa3-a730-44081a44f689, а DocId как 18c3e09c-b5be-48e7-a754-7a2ce53e0999.

Мы также видим, что TargetExpirationDate установлен для 19 апреля 2023 года в 18:08:53 UTC. Это означает, что если мы обрезим на основе этого расписания, мы зададим дату окончания срока действия для этой версии в указанное время.

Примечание.

Все время даты представлены в формате кругового пути. Дополнительные сведения см. в разделе Standard строк формата даты и времени — .NET | Microsoft Learn

Анализ хранилища версий для сайтов

Перед началом анализа необходимо обновить TargetExpirationDate столбец в файле отчета до нужных дат, например версий, срок действия которых истек. Опять же, если вы выберете дату, которая находится в прошлом для версии, эта версия будет рассматриваться как "версия, срок действия которой уже истек" и будет удалена сразу после начала обрезки.

Вы можете вручную обновить даты в , TargetExpirationDate изменив CSV-файл. Однако у вас может быть слишком много строк для обновления вручную. Для массового обновления столбца можно использовать формулы Excel или один из сценариев PowerShell, которые мы предоставили в руководстве по анализу "Что если". В частности, вы можете выбрать режим обрезки, запустить соответствующий скрипт, чтобы получить обновленный CSV-файл с TargetExpirationDate заполненным на основе этого режима обрезки, и продолжить оттуда.

Вариант 1. Анализ отчета с помощью Excel

Откройте общую книгу Excel AnalyzeReportFile_Template.xlsx. В нем можно найти следующие листы.

  • Конфигурация. Используйте этот лист, чтобы задать диапазон дат для создания различных представлений отчета.
  • Набор данных. Этот лист является необработанным набором данных, импортированным из файла отчета. На основе этого набора данных создаются различные сводные представления отчетов.
  • Предустановленные отчеты. Ниже приведен список предустановленных представлений, которые можно использовать для понимания влияния применения выбранного параметра на версии, хранящиеся на сайте:
    • Сводка. Анализ текущего состояния хранилища версий для этого сайта и удаленного распределения версий в новых параметрах.
    • Затронутые пользователи. Проверьте пользователей, версии которых будут затронуты в новых параметрах.
    • Число версий. Таблица и диаграмма, показывающая количество версий, которые будут доступны с течением времени по текущему расписанию, и количество версий, которые будут доступны по новому расписанию.
    • Анализ размера версий. Сравните размер версий, которые будут удаляться с течением времени по текущему расписанию, и количество версий, которые будут доступны по новому расписанию.
    • Анализ уровня файлов. Проверьте удаление версий на уровне файлов в новых параметрах.

Заполните книгу, выполнив следующие действия.

  1. На листе Конфигурация введите полный путь к файлу отчета What-If в ячейке B3.

    Снимок экрана: лист конфигурации.

  2. Если вы хотите изменить диапазон дат графов на листе Число доступных версий или Размер листов с истекшим сроком действия , измените соответствующие значения в ячейках B6, B7, B10 и (или) B11. Это необязательно.

    Снимок экрана: анализ конфигурации версии.

  3. В верхней части Excel перейдите на вкладку Данные и на ленте нажмите кнопку Обновить все .

    Снимок экрана: вкладка

  4. На листе Анализ на уровне файлов автоматически заполите столбцы Число версий и Количество версий, оставшихся после удаления .

    Снимок экрана: лист вычислений 1.

    Снимок экрана: лист вычислений 2.

    Совет

    Вы можете выбрать ячейку с данными и дважды щелкнуть дескриптор заполнения, чтобы завершить автозаполнение. Значок дескриптора заполнения Excel.

  5. На листе Затронутые пользователи автоматически заполите столбец Число версий будет удалено .

    Снимок экрана: лист затронутых пользователей.

Теперь все листы должны быть обновлены. Вы можете проверка интересующую вас информацию.

Второй вариант. Анализ отчета с помощью PowerShell

  1. Сохраните скрипт как файл с именемAnalyzeReportFile.ps1.
# save this file as AnalyzeReportFile.ps1

Param(
  [Parameter(Mandatory=$true)][string] $ReportLocalFilePath,
  [Parameter(Mandatory=$false)][int]$ShowFilesWithFewerThanNVersions=10,
  [Parameter(Mandatory=$false)][DateTime]$TimelineStartDate=[DateTime]::Now,
  [Parameter(Mandatory=$false)][int]$TimelineStepDays=10,
  [Parameter(Mandatory=$false)][int]$TimelineNumSteps=10
)
function Import-Dataset($DatasetFilePath)
{
  $Dataset = Import-CSV $DatasetFilePath
  $Columns = $Dataset `
    | Get-Member -MemberType 'NoteProperty' `
    | Select-Object -ExpandProperty Name
  $CompactColumns = $Columns | Where-Object { $_ -Match ".Compact" }
   
  $Timer = [Diagnostics.Stopwatch]::StartNew()
  for ($RowIndex = 0; $RowIndex -lt $Dataset.Count; $RowIndex++)
  {
    if ($RowIndex -gt 0)
    {
      $PrevRow = $Dataset[$RowIndex-1]
    }
    $Row = $Dataset[$RowIndex]
   
    foreach ($ColName in $Columns)
    {
      if ([string]::IsNullOrEmpty($Row.$ColName))
      {
        if (($ColName -in $CompactColumns) -and ($RowIndex -gt 0))
        {
          $Row.$ColName = $PrevRow.$ColName
        }
        else
        {
          $Row.$ColName = $null
        }
      }
    }
   
    $Row."WebId.Compact" = [Guid]$Row."WebId.Compact"
    $Row."DocId.Compact" = [Guid]$Row."DocId.Compact"
    $Row."MajorVersion" = [Int32]$Row."MajorVersion"
    $Row."MinorVersion" = [Int32]$Row."MinorVersion"
    $Row."WebUrl.Compact" = [String]$Row."WebUrl.Compact"
    $Row."FileUrl.Compact" = [String]$Row."FileUrl.Compact"
    $Row."Size" = [Int64]$Row."Size"
    $Row."ModifiedBy_UserId.Compact" = [String]$Row."ModifiedBy_UserId.Compact"
    $Row."ModifiedBy_DisplayName.Compact" = [String]$Row."ModifiedBy_DisplayName.Compact"
    $Row."LastModifiedDate" = [DateTime]$Row."LastModifiedDate"
    $Row."SnapshotDate" = [DateTime]$Row."SnapshotDate"
    $Row."IsSnapshotDateEstimated" = [bool]$Row."IsSnapshotDateEstimated"
    $Row."CurrentExpirationDate" = [System.Nullable[DateTime]]$Row."CurrentExpirationDate"
    $Row."AutomaticPolicyExpirationDate" = [System.Nullable[DateTime]]$Row."AutomaticPolicyExpirationDate"
    $Row."TargetExpirationDate" = [System.Nullable[DateTime]]$Row."TargetExpirationDate"
    $Percent = [Math]::Ceiling(100 * $RowIndex / $Dataset.Count)
    Write-Progress `
      -Activity "Reading dataset" `
      -Status "$Percent% Complete ($($RowIndex + 1) / $($Dataset.Count) rows):" `
      -PercentComplete $Percent `
      -SecondsRemaining $(($Dataset.Count - ($RowIndex + 1)) / (($RowIndex + 1) / $Timer.Elapsed.Totalseconds))
  }
  $Timer.Stop()
  return $Dataset
}
function Get-NumVersionExpiresByDate($Dataset, $ColName, $DateCutoff)
{
  $VersionsExpired = $Dataset | Where-Object { ($null -ne $_.$ColName) -and ($_.$ColName -le $DateCutoff) }
  $IsTodayStr = ""
  If ((Get-Date).Date -eq ($DateCutoff).Date) 
  {
    $IsTodayStr = "*"
  }
  return [PSCustomObject]@{
    Today              = $IsTodayStr
    Date              = $DateCutoff
    NumberOfVersionsAvailable    = $Dataset.Count - $VersionsExpired.Count
    NumberOfVersionsExpired     = $VersionsExpired.Count
    SizeOfVersionsExpiredInBytes  = ($VersionsExpired | Measure-Object Size -Sum).Sum
  }
}
function Get-FilesWithFewerThanNVersions($Dataset, $NumVersions)
{
  $AvailableVersionsByFile = $Dataset `
    | Where-Object { ($null -eq $_.TargetExpirationDate) -or ($_.TargetExpirationDate -gt [DateTime]::Now) } `
    | Group-Object -Property WebId.Compact, DocId.Compact
  $AvailableFilesWithNotEnoughVersions = @{}
  # Files with some versions left but not enough
  $AvailableVersionsByFile `
    | Where-Object Count -lt $NumVersions `
    | ForEach-Object { $AvailableFilesWithNotEnoughVersions[$_.Name] = $_.Count }
  # Files with 0 versions left
  $Dataset `
    | Group-Object -Property WebId.Compact, DocId.Compact `
    | Where-Object { $AvailableVersionsByFile.Name -notcontains $_.Name } `
    | ForEach-Object { $AvailableFilesWithNotEnoughVersions[$_.Name] = 0 }
  # Stitch all of the data together
  return $Dataset `
    | Group-Object -Property WebId.Compact, DocId.Compact `
    | Where-Object Count -ge $NumVersions `
    | Where-Object { $AvailableFilesWithNotEnoughVersions.Contains($_.Name) } `
    | ForEach-Object `
      {
        $fileUrl = $_.Group[0]."WebUrl.Compact" + "/" + $_.Group[0]."FileUrl.Compact"
        $numberOfVersionsAvailableBeforeTrim = $_.Count
        $numberOfVersionsAvailableAfterTrim = $AvailableFilesWithNotEnoughVersions[$_.Name]
        $numberOfVersionsTrimmed = $numberOfVersionsAvailableBeforeTrim - $numberOfVersionsAvailableAfterTrim
        [PSObject]::new() | 
          Add-Member -PassThru -NotePropertyMembers ([Ordered]@{
            FileUrl = $fileUrl
            NumberOfVersionsAvailableBeforeTrim = $numberOfVersionsAvailableBeforeTrim
            NumberOfVersionsAvailableAfterTrim = $numberOfVersionsAvailableAfterTrim
            NumberOfVersionsTrimmed = $numberOfVersionsTrimmed
          })
      } `
    | Sort-Object -Property NumberOfVersionsAvailableAfterTrim
}
function Get-MostImpactedUsers($Dataset)
{
  $VersionsExpired = $Dataset | Where-Object { ($null -ne $_.TargetExpirationDate) -and ($_.TargetExpirationDate -le [DateTime]::Now) }
  return $VersionsExpired `
    | Group-Object -Property ModifiedBy_UserId.Compact `
    | Select-Object `
      @{ L = "UserId"; E = { $_.Group[0]."ModifiedBy_UserId.Compact" } }, `
      @{ L = "UserDisplayName"; E = { $_.Group[0]."ModifiedBy_DisplayName.Compact" } },
      @{ L = "NumberOfVersionsTrimmed"; E = { $_.Count } } `
    | Sort-Object -Property NumberOfVersionsTrimmed -Descending
}
$Dataset = Import-Dataset -DatasetFilePath $ReportLocalFilePath
$CurrentExpirationSummaryTable = @()
$TargetExpirationSummaryTable = @()
$Timer = [Diagnostics.Stopwatch]::StartNew()
for ($Step = 0; $Step -lt $TimelineNumSteps; $Step++)
{
  $DateCutOff = $TimelineStartDate.AddDays($TimelineStepDays * $Step)
  $CurrentExpirationSummaryTable += `
    Get-NumVersionExpiresByDate -Dataset $Dataset -ColName CurrentExpirationDate -DateCutoff $DateCutOff
  $TargetExpirationSummaryTable += `
    Get-NumVersionExpiresByDate -Dataset $Dataset -ColName TargetExpirationDate -DateCutoff $DateCutOff
}
$Timer.Stop()
Write-Host "===========================" -ForegroundColor Yellow
Write-Host "Current Expiration Schedule" -ForegroundColor Yellow
Write-Host "===========================" -ForegroundColor Yellow
$CurrentExpirationSummaryTable | Format-Table -Autosize | Out-String | Write-Host
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds / 2)" -ForegroundColor Green
Write-Host
Write-Host "==========================" -ForegroundColor Yellow
Write-Host "Target Expiration Schedule" -ForegroundColor Yellow
Write-Host "==========================" -ForegroundColor Yellow
$TargetExpirationSummaryTable | Format-Table -Autosize | Out-String | Write-Host
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds / 2)" -ForegroundColor Green
Write-Host
Write-Host "================================" -ForegroundColor Yellow
Write-Host "Files with Fewer Than $ShowFilesWithFewerThanNVersions Versions" -ForegroundColor Yellow
Write-Host "================================" -ForegroundColor Yellow
$Timer = [Diagnostics.Stopwatch]::StartNew()
Get-FilesWithFewerThanNVersions -Dataset $Dataset -NumVersions $ShowFilesWithFewerThanNVersions | Format-Table -Autosize | Out-String | Write-Host
$Timer.Stop()
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds)" -ForegroundColor Green
Write-Host
Write-Host "==============" -ForegroundColor Yellow
Write-Host "Users Impacted" -ForegroundColor Yellow
Write-Host "==============" -ForegroundColor Yellow
$Timer = [Diagnostics.Stopwatch]::StartNew()
Get-MostImpactedUsers -Dataset $Dataset | Format-Table -Autosize | Out-String | Write-Host
$Timer.Stop()
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds)" -ForegroundColor Green
Write-Host
  1. Откройте PowerShell и выполните следующую команду, заменив значения заполнителей соответствующими значениями.

Примечание.

Используйте PowerShell 7 для выполнения команд. Вы можете установить PowerShell 7, выполнив следующие инструкции: Установка PowerShell в Windows — PowerShell | Microsoft Learn.

. “<path to AnalyzeReportFile.ps1>” –ReportLocalFilePath “<path to the file version expiration What-If report .csv file>”

Снимок экрана: команда powershell для анализа отчета.

  1. В выходных данных отображаются четыре таблицы:
  • Текущее расписание окончания срока действия. Эта таблица содержит сводку временных рядов для ваших версий в том виде, в котором они есть. Он содержит следующие столбцы:

    1. Дата: первый столбец представляет дату.
    2. NumberOfVersionsAvailable: количество версий, доступных на эту дату по текущему расписанию.
    3. NumberOfVersionsExpired: количество версий, срок действия которых истек в эту дату в соответствии с текущим расписанием.
    4. SizeOfVersionsExpiredMB: размер версий, истекший в эту дату в соответствии с текущим расписанием.

    Снимок экрана: текущее расписание окончания срока действия.

  • Целевое расписание окончания срока действия. Эта таблица совпадает с текущим расписанием окончания срока действия, но вместо этого отражает обновленное расписание. Эта таблица полезна только в том случае, если вы хотите протестировать различные сценарии истечения срока действия путем изменения столбца TargetExpirationDate в отчете об истечении срока действия версии файла.

    Снимок экрана: целевое расписание окончания срока действия.

  • Файлы с менее чем 10 версиями: список URL-адресов и количество версий до и после удаления для тех файлов, число версий которых меньше 10 после немедленного удаления (но до немедленного удаления было больше 10).

    Снимок экрана: файлы с менее чем 10 версиями.

  • Затронутые пользователи: пользователи, версии которых будут немедленно удалены.

    Снимок экрана: затронутые пользователи.

При необходимости можно настроить параметры:

  • TimelineStartDate: начальная дата для таблиц 1 и 2 выше.
  • TimelineStepDays: количество дней между строками для таблиц 1 и 2 выше.
  • TimelineNumSteps: количество строк, вычисляемых для таблиц 1 и 2 выше.
  • ShowFilesWithFewerThanNVersions: пороговое значение для числа версий в таблице 3 выше.