Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Понимание хранилища версий на сайте позволяет лучше оптимизировать параметры журнала версий в соответствии с целями восстановления вашей организации и управлять затратами на хранение.
В этом руководстве показано, как создать отчет об использовании хранилища версий и проанализировать его, чтобы лучше понять объем хранилища версий сайта. Отчет также можно использовать для выполнения анализа "что если" применения различных ограничений версий или обрезки существующих версий.
В этом руководстве рассматриваются следующие действия:
- Создание файла отчета об использовании хранилища версий для сайта или библиотеки.
- Проверьте ход создания отчета.
- Общие сведения о файле отчета.
- Анализ использования хранилища версий с помощью Excel или PowerShell.
В последующих руководствах вы узнаете, как можно выполнить анализ влияния на созданный отчет CSV.
Подготовка к работе
- Определите сайт SharePoint, учетную запись OneDrive или библиотеку документов, использование хранилища версий которых вы хотите узнать.
- Выберите расположение в библиотеке документов SharePoint, в которое вы хотите сохранить отчет.
- Скачайте последнюю версию командной консоли SharePoint Online.
Примечание.
- Файл отчета создается в указанном расположении отчета.
- Расположение отчета должно находиться в самой библиотеке документов SharePoint.
- В библиотеке документов не может быть файл с тем же именем, что и у отчета.
Создание отчета об использовании версий для сайтов или библиотеки
Вы можете создать отчет о текущем хранилище версий, используемом на сайте, выполнив 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. В нем можно найти следующие листы.
- Конфигурация. Используйте этот лист, чтобы задать диапазон дат для создания различных представлений отчета.
- Набор данных. Этот лист является необработанным набором данных, импортированным из файла отчета. На основе этого набора данных создаются различные сводные представления отчетов.
-
Предустановленные отчеты. Ниже приведен список предустановленных представлений, которые можно использовать для понимания влияния применения выбранного параметра на версии, хранящиеся на сайте:
- Сводка. Анализ текущего состояния хранилища версий для этого сайта и удаленного распределения версий в новых параметрах.
- Затронутые пользователи. Проверьте пользователей, версии которых будут затронуты в новых параметрах.
- Число версий. Таблица и диаграмма, показывающая количество версий, которые будут доступны с течением времени по текущему расписанию, и количество версий, которые будут доступны по новому расписанию.
- Анализ размера версий. Сравните размер версий, которые будут удаляться с течением времени по текущему расписанию, и количество версий, которые будут доступны по новому расписанию.
- Анализ уровня файлов. Проверьте удаление версий на уровне файлов в новых параметрах.
Заполните книгу, выполнив следующие действия.
На листе Конфигурация введите полный путь к файлу отчета What-If в ячейке B3.
Если вы хотите изменить диапазон дат графов на листе Число доступных версий или Размер листов с истекшим сроком действия , измените соответствующие значения в ячейках B6, B7, B10 и (или) B11. Это необязательно.
В верхней части Excel перейдите на вкладку Данные и на ленте нажмите кнопку Обновить все .
На листе Анализ на уровне файлов автоматически заполите столбцы Число версий и Количество версий, оставшихся после удаления .
На листе Затронутые пользователи автоматически заполите столбец Число версий будет удалено .
Теперь все листы должны быть обновлены. Вы можете проверка интересующую вас информацию.
Второй вариант. Анализ отчета с помощью PowerShell
- Сохраните скрипт как файл с именем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
- Откройте 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>”
- В выходных данных отображаются четыре таблицы:
Текущее расписание окончания срока действия. Эта таблица содержит сводку временных рядов для ваших версий в том виде, в котором они есть. Он содержит следующие столбцы:
- Дата: первый столбец представляет дату.
- NumberOfVersionsAvailable: количество версий, доступных на эту дату по текущему расписанию.
- NumberOfVersionsExpired: количество версий, срок действия которых истек в эту дату в соответствии с текущим расписанием.
- SizeOfVersionsExpiredMB: размер версий, истекший в эту дату в соответствии с текущим расписанием.
Целевое расписание окончания срока действия. Эта таблица совпадает с текущим расписанием окончания срока действия, но вместо этого отражает обновленное расписание. Эта таблица полезна только в том случае, если вы хотите протестировать различные сценарии истечения срока действия путем изменения столбца TargetExpirationDate в отчете об истечении срока действия версии файла.
Файлы с менее чем 10 версиями: список URL-адресов и количество версий до и после удаления для тех файлов, число версий которых меньше 10 после немедленного удаления (но до немедленного удаления было больше 10).
Затронутые пользователи: пользователи, версии которых будут немедленно удалены.
При необходимости можно настроить параметры:
-
TimelineStartDate: начальная дата для таблиц 1 и 2 выше. -
TimelineStepDays: количество дней между строками для таблиц 1 и 2 выше. -
TimelineNumSteps: количество строк, вычисляемых для таблиц 1 и 2 выше. -
ShowFilesWithFewerThanNVersions: пороговое значение для числа версий в таблице 3 выше.