Tutorial: Generación y análisis del informe de uso de versiones para el sitio de SharePoint
Al comprender el almacenamiento de versiones en un sitio, puede optimizar mejor la configuración del historial de versiones para satisfacer los objetivos de recuperación de su organización y administrar los costos de almacenamiento.
En este tutorial se muestra cómo puede generar un informe de uso del almacenamiento de versiones y analizarlo para comprender mejor la superficie de almacenamiento de versiones del sitio. El informe también se puede usar para ejecutar el análisis "what-if" de la aplicación de diferentes límites de versión o el recorte de versiones existentes.
En este tutorial se explica cómo:
- Genere el archivo de informe de uso del almacenamiento de versiones para el sitio o la biblioteca.
- Compruebe el progreso de la generación de informes.
- Comprenda el archivo de informe.
- Analice el uso del almacenamiento de versiones mediante Excel o PowerShell.
En tutoriales posteriores, revise cómo puede ejecutar el análisis de impacto en el informe CSV generado.
Antes de empezar
- Identifique el sitio de SharePoint, la cuenta de OneDrive o la biblioteca de documentos cuyo uso de almacenamiento de versiones quiera comprender.
- Elija una ubicación dentro de la biblioteca de documentos de SharePoint en la que desea guardar el informe.
- Descargue el Shell de administración de SharePoint Online más reciente.
Nota:
- El archivo de informe se genera dentro de la ubicación del informe especificada.
- La ubicación del informe debe estar dentro de una propia biblioteca de documentos de SharePoint.
- No puede haber un archivo con el mismo nombre que el informe en la biblioteca de documentos.
Generación de un informe de uso de versiones para sitios o bibliotecas
Puede generar un informe sobre el uso de almacenamiento de versión actual en un sitio ejecutando el New-SPOSiteFileVersionExpirationReportJob
comando o en una biblioteca mediante la ejecución del New-SPOListFileVersionBatchDeleteJob
comando.
En el ejemplo siguiente, se pone en cola un trabajo para generar un informe con ámbito de sitio en la ubicación del informe, 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"
En el ejemplo siguiente, se pone en cola un trabajo para generar un informe con ámbito de biblioteca en la ubicación del informe, 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"
Comprobación del progreso en la generación de informes
Use el Get-SPOListFileVersionExpirationReportJobProgress
comando para realizar un seguimiento del progreso de la solicitud de generación de informes.
En el ejemplo siguiente se muestra cómo comprobar si el informe con ámbito de sitio está completamente rellenado y listo para analizarse.
Get-SPOSiteFileVersionExpirationReportJobProgress -Identity https://contoso.sharepoint.com/sites/site1 -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"
En el ejemplo siguiente se muestra cómo comprobar si el informe con ámbito de biblioteca está completamente rellenado y listo para analizarse.
Get-SPOListFileVersionExpirationReportJobProgress -Site https://contoso.sharepoint.com/sites/site1 -List "Documents" -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"
El cmdlet devolverá una respuesta en formato JSON. La respuesta json devuelta tiene una clave denominada status. Consulte la tabla siguiente para obtener uno de los siguientes valores esperados:
Respuesta de estado JSON | Explicación |
---|---|
"completado" | El trabajo se ha completado correctamente y el informe se ha rellenado por completo. |
"in_progress" | Hay un trabajo activo. El informe se rellena parcialmente. |
"no_report_found" | No hay ningún trabajo activo rellenando el archivo especificado. |
"error" | Error en el trabajo para generar el informe debido al mensaje de error. Compruebe "error_message" el mensaje de error del error. |
Descripción del archivo de informe de versión
El informe generado está en formato CSV y cada fila corresponde a una versión de archivo. Este es un ejemplo del informe de expiración de la versión del archivo y su desglose de columnas.
La primera fila es el encabezado con los identificadores de columna que contienen identificadores de versión de archivo, información de metadatos de versión y marca de tiempo de expiración. Las columnas compactas se indican con .Compact
una corrección posterior que no repetirá los valores si dos filas consecutivas tienen el mismo valor. Las otras filas representan versiones de archivo, donde cada fila representa una sola versión.
Vamos a ver la primera versión de archivo que se muestra en este informe.
Los identificadores de versión de archivo:
WebId
,DocId
,MajorVersion
eMinorVersion
identifican de forma única cada versión del sitio de SharePoint.Identificadores de metadatos de versión:
WebUrl
indica la versión dehttps://contoso.sharepoint.com
eFileUrl
indica que el archivo de esta versión se encuentra en DocLib/MyDocument.docx. En otras palabras, se encuentra en una biblioteca de documentos denominadaDocLib
, mientras que el archivo está en la carpeta raíz deDocLib
y se denomina MyDocument.docx.Size
indica que la versión toma 92 246 bytes de almacenamiento.Las dos columnas siguientes e
ModifiedBy_UserId
ModifiedBy_DisplayName
indican que la usuario Michelle Harris (con el identificador de usuario 6) ha creado esta versión.LastModifiedDate
indica que el contenido de la versión se modificó por última vez el 13 de marzo de 2023, a las 22:36:09 UTC.SnapshotDate
muestra que la versión se convirtió en una versión histórica el 20 de marzo de 2023, a las 16:56:51 UTC.IsSnapshotDateEstimated
muestra queSnapshotDate
es la fecha de instantánea real.Identificadores de programación de expiración:
CurrentExpirationDate
indica que esta versión está establecida actualmente en nunca expirar.AutomaticPolicyExpirationDate
muestra que en la directiva de expiración automática, esta versión también se establece para que nunca expire.TargetExpirationDate
indica que si seguimos esta programación para el recorte, esta versión no expiraría nunca.
Nota:
Las versiones de archivo almacenadas en la biblioteca de suspensión de conservación también se incluirán en este informe.
Echemos un vistazo a la tercera versión.
Los WebId
valores y DocId
están vacíos porque estas columnas son columnas compactas, indicadas por . Después de la corrección compacta, significa que deben tener valores. Si buscamos la última ninguno encima de esa fila, encontramos WebId
como 4c7a58c1-01f2-4fa3-a730-44081a44f689
, y DocId
como 18c3e09c-b5be-48e7-a754-7a2ce53e0999
.
También podemos ver que está establecido para el TargetExpirationDate
19 de abril de 2023, a las 18:08:53 UTC. Significa que si recortamos en función de esta programación, estaríamos estableciendo la fecha de expiración de esta versión en esa hora.
Nota:
Todas las horas de fecha se representan en el formato de ida y vuelta. Para obtener más información, vea Standard cadenas de formato de fecha y hora: .NET | Microsoft Learn
Análisis del almacenamiento de versiones para sitios
Antes de iniciar el análisis, debe actualizar la columna del TargetExpirationDate
archivo de informe a las fechas que desee, como las versiones que van a expirar. De nuevo, si elige una fecha que está en el pasado para una versión, esa versión se tratará como "versión que ya había expirado" y se eliminará inmediatamente después de iniciar el recorte.
Puede actualizar manualmente las fechas de TargetExpirationDate
editando el archivo csv. Sin embargo, es posible que tenga demasiadas filas para actualizar a mano. Para actualizar de forma masiva la columna, puede usar fórmulas de Excel o también puede usar uno de los scripts de PowerShell que hemos proporcionado en Tutorial: Ejecución del análisis "What-If". En concreto, puede elegir un modo de recorte, ejecutar el script correspondiente para obtener un archivo CSV actualizado con TargetExpirationDate
rellenado en función de ese modo de recorte y continuar desde allí.
Opción uno: Analizar el informe mediante Excel
Abra el libro de Excel compartido AnalyzeReportFile_Template.xlsx. Puede encontrar las hojas de cálculo siguientes en él.
- Configuración: use esta hoja de cálculo para establecer el intervalo de fechas para generar las distintas vistas de informe.
- Conjunto de datos: esta hoja de cálculo es el conjunto de datos sin procesar importado desde el archivo de informe. A partir de este conjunto de datos se construyen varias vistas de resumen de informes.
-
Informes preestablecidos: esta es una lista de vistas preestablecidas que se pueden usar para comprender el impacto de aplicar la configuración seleccionada en las versiones almacenadas en el sitio:
- Resumen: analice el estado actual del almacenamiento de versiones de este sitio y la distribución de versiones eliminadas en la nueva configuración.
- Usuarios afectados: revise los usuarios cuyas versiones se verían afectadas en la nueva configuración.
- Recuento de versiones: tabla y gráfico que muestran el número de versiones que estarán disponibles a lo largo del tiempo según la programación actual y el número de versiones que estarán disponibles en la nueva programación.
- Análisis de tamaño de versión: compare el tamaño de las versiones que se eliminarán con el tiempo según la programación actual y el número de versiones que estarán disponibles en la nueva programación.
- Análisis de nivel de archivo: revise las eliminaciones de la versión de nivel de archivo en la nueva configuración.
Rellene el libro siguiendo estos pasos:
En la hoja de cálculo Configuración , escriba la ruta de acceso completa al archivo de informe What-If en la celda B3.
Si desea cambiar el intervalo de fechas de los gráficos en la hoja de cálculo Número de versiones disponibles o tamaño de la hoja de cálculo Tamaño de las versiones expiradas , cambie los valores correspondientes en celdas B6, B7, B10 y/o B11. Es opcional.
En la parte superior de Excel, seleccione la pestaña Datos y, en la cinta de opciones, seleccione el botón Actualizar todo .
En la hoja de cálculo Análisis de nivel de archivo , autorrellenar las columnas Número de versiones y Número de versiones restantes después de la eliminación .
En la hoja de cálculo Usuarios afectados , autorrellenará automáticamente la columna Número de versiones que se eliminarán .
Todas las hojas de cálculo deben estar actualizadas. Puede comprobar la información que le interesa.
Opción dos: Analizar el informe mediante PowerShell
- Guarde el script como un archivo denominado 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
- Abra PowerShell y ejecute el siguiente comando, reemplazando los valores de marcador de posición por los valores adecuados.
Nota:
Use PowerShell 7 para ejecutar los comandos. Puede instalar PowerShell 7 siguiendo estas instrucciones: Instalación de PowerShell en Windows: PowerShell | Microsoft Learn.
. “<path to AnalyzeReportFile.ps1>” –ReportLocalFilePath “<path to the file version expiration What-If report .csv file>”
- La salida muestra cuatro tablas:
Programación de expiración actual: esta tabla contiene un resumen de serie temporal para las versiones tal como están. Tiene las siguientes columnas:
- Fecha: la primera columna representa la fecha.
- NumberOfVersionsAvailable: el número de versiones disponibles en esa fecha según la programación actual.
- NumberOfVersionsExpired: el número de versiones expiró en esa fecha según la programación actual.
- SizeOfVersionsExpiredMB: el tamaño de las versiones expiró en esa fecha según la programación actual.
Programación de expiración de destino: esta tabla es la misma que la programación de expiración actual, pero refleja la programación actualizada en su lugar. Esta tabla solo resulta útil si desea probar diferentes escenarios de expiración cambiando la columna TargetExpirationDate en el informe de expiración de la versión del archivo.
Archivos con menos de 10 versiones: una lista de las direcciones URL y el número de versiones anteriores y posteriores a la eliminación de los archivos cuyo número de versiones es menor que 10 después de la eliminación inmediata (pero era superior a 10 antes de la eliminación inmediata).
Usuarios afectados: los usuarios cuyas versiones se eliminarían inmediatamente.
Opcionalmente, puede ajustar los parámetros:
-
TimelineStartDate
: la fecha de inicio de las tablas 1 y 2 anteriores. -
TimelineStepDays
: el número de días entre filas de las tablas 1 y 2 anteriores. -
TimelineNumSteps
: el número de filas que se calcularán para las tablas 1 y 2 anteriores. -
ShowFilesWithFewerThanNVersions
: umbral para el número de versiones de la tabla 3 anterior.