Búsqueda de sitios web

Conversión de períodos de tiempo en patrones de repetición


En Petri.com, recientemente publiqué un artículo de seguimiento sobre la creación de trabajos de PowerShell programados diarios o semanales que admitan un intervalo de repetición. La respuesta corta es utilizar los cmdlets de Tareas programadas. En el artículo de Petri hablo sobre la necesidad de utilizar un formato de cadena especial para el intervalo de tiempo. Está documentado en MSDN.

No es especialmente difícil resolverlo, pero pensé que sería útil tener una función de PowerShell para convertir un intervalo de tiempo a este formato.

Function ConvertTo-RepetitionPattern {
<#
.Synopsis
Convert a timespan to an XML repetition pattern
.Description
When creating scheduled tasks, repetition duration and intervals must be set using a special XML format.

P<days>DT<hours>H<minutes>M<seconds>S

The minimum time allowed is 1 minute and the maximum is 31 days.
.Example
PS C:\> new-timespan -Minutes 10 | ConvertTo-RepetitionPattern
PT10M
.Example
PS C:\> ConvertTo-RepetitionPattern "0:1:10:0"
PT1H10M
.Link
https://msdn.microsoft.com/en-us/library/windows/desktop/aa382117%28v=vs.85%29.aspx#properties
.Link
New-Timespan
#>
[cmdletbinding()]
Param(
[Parameter(Position=0,Mandatory,HelpMessage = "Enter a timespan",
ValueFromPipeline)]
[ValidateScript({$_.totalminutes -ge 1 -AND $_.totaldays -le 31})]
[timespan]$Timespan
)

Begin {
    Write-Verbose "Starting $($MyInvocation.Mycommand)"
    [string]$pattern = "P"  
} #begin

Process {
    Write-Verbose "Converting $Timespan"
    if ($Timespan.Days -gt 0) {
        Write-Verbose "$($timespan.days) Days"
        $Pattern+= "{0}D" -f $Timespan.Days
    }
    #insert T separater
    $Pattern+="T"

    if ($Timespan.Hours -gt 0) {
    Write-Verbose "$($timespan.hours) Hours"
        $Pattern+= "{0}H" -f $Timespan.hours
    }
    if ($Timespan.Minutes -gt 0) {
    Write-Verbose "$($timespan.Minutes) Minutes"
        $Pattern+= "{0}M" -f $Timespan.Minutes
    }
    if ($Timespan.Seconds -gt 0) {
        Write-Verbose "$($timespan.seconds) Seconds"
        $Pattern+= "{0}S" -f $Timespan.Seconds
    }

    #write the result to the pipeline
    $pattern
}
End {
    Write-Verbose "Ending $($MyInvocation.Mycommand)"
} #end

} #end function

Técnicamente, el patrón admitirá cualquier intervalo de tiempo, pero como el patrón utilizado con las tareas programadas debe estar entre 1 minuto y 31 días, lo agregué como parámetro de validación. La función simplemente construye la cadena final en función del número de elementos de fecha y hora, es decir, horas, minutos y segundos.

Esperemos que esta función facilite la automatización del trabajo programado y el proceso de tareas.

Artículos relacionados