powershell - una - ejecutar tanto si el usuario inicio sesion como si no
Tarea programada con activaciĆ³n diaria e intervalo de repeticiĆ³n (7)
Parece que no puedo descubrir cómo crear una nueva tarea programada que se activa diariamente y se repite cada 30 minutos. He estado yendo en círculos.
Todo sobre esto a continuación funciona para configurar la tarea que quiero, pero solo se activa una vez.
#Credentials to run task as
$username = "$env:USERDOMAIN/$env:USERNAME" #current user
$password = "notmypass"
#Location of Scripts:
$psscript = "C:/test/test.ps1"
$Sourcedir ="C:/testsource/"
$destdir = "C:/testdest/"
$archivepassword = "notmypass"
####### Create New Scheduled Task
$action = New-ScheduledTaskAction -Execute "Powershell" -Argument "-WindowStyle Hidden `"$psscript `''$sourcedir`'' `''$destdir`'' `''$archivepassword`''`""
$trigger = New-ScheduledTaskTrigger -Once -At 7am -RepetitionDuration (New-TimeSpan -Days 1) -RepetitionInterval (New-TimeSpan -Minutes 30)
$settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable
$ST = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask EncryptSyncTEST -InputObject $ST -User $username -Password $password
Si cambio -Once
que -Daily
, pierdo los indicadores -RepetitionInterval
. Y si vuelvo a actualizar la tarea a diario después de registrarla, se borra el desencadenante repetitivo.
Este no es un método de programación poco común, y se aplica fácilmente a través de la IU del programador de tareas. Siento que es probablemente simple pero me lo estoy perdiendo.
Cualquier ayuda es apreciada.
EDITAR: abordar la pregunta duplicada. La pregunta en la publicación " Powershell v3 New-JobTrigger diariamente con repetición " está preguntando lo mismo. Pero como comenté anteriormente, ninguna de las respuestas resuelve el problema. La respuesta marcada hace exactamente lo que ya tengo aquí, establece una tarea con un desencadenante -Once, luego la actualiza para que se repita cada 5 minutos durante 1 día. Después del primer día esa tarea nunca se volverá a activar. No aborda el problema de desencadenar una tarea todos los días con repetición y duración hasta el siguiente desencadenante.
Las otras tres respuestas en esa publicación tampoco están abordando la pregunta. No sé por qué se marcó como contestada, porque no es correcta. Exploré completamente esas respuestas antes de publicar esta pregunta. Con esa publicación envejecida y marcada como contestada creé esta pregunta.
Nota : He encontrado una solución alternativa, pero no excelente. En la actualidad, parece que la forma más fácil de definir disparadores personalizados utilizando powershell es manipular el XML de tareas programadas e importarlo directamente utilizando la tarea de Register-ScheduledTask
Crear disparador base:
$t1 = New-ScheduledTaskTrigger -Daily -At 01:00
Crear disparador secundario:
$t2 = New-ScheduledTaskTrigger -Once -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration (New-TimeSpan -Hours 23 -Minutes 55)
Tome el objeto de repetición del secundario e insértelo en el disparador base:
$t1.Repetition = $t2.Repetition
Bob es tu tio:
New-ScheduledTask -Trigger $t1 -Action ...
El método más fácil que encontré para lograr esto es usar schtasks.exe. Consulte la documentación completa en https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357%28v=vs.85%29.aspx
schtasks.exe /CREATE /SC DAILY /MO 1 /TN ''task name'' /TR ''powershell.exe C:/test.ps1'' /ST 07:00 /RI 30 /DU 24:00
Esto crea una tarea que se ejecuta diariamente, se repite cada 30 minutos, por una duración de 1 día.
Esta es una forma de crear una tarea programada en Powershell (v5 en mi máquina, YMMV) que comenzará a las 12AM todos los días y se repetirá cada hora por el resto del día . Por lo tanto, se ejecutará indefinidamente. Creo que este es un enfoque superior frente a la configuración -RepetitionDuration
to ([timespan]::MaxValue)
como comenté anteriormente, ya que el activador se mostrará en el Programador de tareas como:
A las 12:00 AM todos los días: después de activarse, repita cada 30 minutos durante un día.
En lugar de que la fecha en la que se registró la tarea aparezca en el desencadenante como enfoques que utilizan -Once -At 12am
resulten, cree el desencadenante como un simple -Daily -At 12am
, registre la tarea y luego acceda a algunas propiedades adicionales en las tareas Desencadenadores propiedad;
$action = New-ScheduledTaskAction -Execute <YOUR ACTION HERE>
$trigger = New-ScheduledTaskTrigger -Daily -At 12am
$task = Register-ScheduledTask -TaskName "MyTask" -Trigger $trigger -Action $action
$task.Triggers.Repetition.Duration = "P1D" //Repeat for a duration of one day
$task.Triggers.Repetition.Interval = "PT30M" //Repeat every 30 minutes, use PT1H for every hour
$task | Set-ScheduledTask
//At this point the Task Scheduler will have the desirable description of the trigger.
Estoy seguro de que debe haber una mejor manera, pero esta es mi solución actual.
Creé una tarea con los desencadenantes que quería y luego tomé el XML que generó.
A continuación, estoy creando la tarea, luego extraigo el XML para esa nueva tarea, sustituyo mis desencadenantes, luego lo desregistro y lo vuelvo a registrar con el XML actualizado.
A largo plazo, probablemente solo use el archivo XML completo para la tarea y reemplace las cadenas según sea necesario, pero esto funciona por ahora.
#Credentials to run task as
$username = "$env:USERDOMAIN/$env:USERNAME" #current user
$password = "notmypass"
#Location of Scripts:
$psscript = "C:/test/test.ps1"
$Sourcedir ="C:/testsource/"
$destdir = "C:/testdest/"
$archivepassword = "notmypass"
####### Create New Scheduled Task
$action = New-ScheduledTaskAction -Execute "Powershell" -Argument "-WindowStyle Hidden ''$EncryptSync'' ''$sourcedir'' ''$destdir'' ''$archivepassword''"
$trigger = New-ScheduledTaskTrigger -Once -At 7am -RepetitionDuration (New-TimeSpan -Days 1) -RepetitionInterval (New-TimeSpan -Minutes 30)
$settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable
$ST = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask "EncryptSyncTEST" -InputObject $ST -User $username -Password $password
[xml]$EncryptSyncST = Export-ScheduledTask "EncryptSyncTEST"
$UpdatedXML = [xml]''<CalendarTrigger xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><Repetition><Interval>PT30M</Interval><Duration>P1D</Duration><StopAtDurationEnd>false</StopAtDurationEnd></Repetition><StartBoundary>2013-11-18T07:07:15</StartBoundary><Enabled>true</Enabled><ScheduleByDay><DaysInterval>1</DaysInterval></ScheduleByDay></CalendarTrigger>''
$EncryptSyncST.Task.Triggers.InnerXml = $UpdatedXML.InnerXML
Unregister-ScheduledTask "EncryptSyncTEST" -Confirm:$false
Register-ScheduledTask "EncryptSyncTEST" -Xml $EncryptSyncST.OuterXml -User $username -Password $password
Otra forma de hacerlo es simplemente crear múltiples desencadenantes de la siguiente manera:
$startTimes = @("12:30am","6am","9am","12pm","3pm","6pm")
$triggers = @()
foreach ( $startTime in $startTimes )
{
$trigger = New-ScheduledTaskTrigger -Daily -At $startTime -RandomDelay (New-TimeSpan -Minutes $jitter)
$triggers += $trigger
}
Si bien la interfaz de PowerShell para los activadores de tareas programadas es limitada, resulta que si configura RepetitionDuration
en [System.TimeSpan]::MaxValue
, se obtiene una duración de "Indefinidamente".
$trigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration ([System.TimeSpan]::MaxValue)
Probado en Windows Server 2012 R2 (PowerShell 4.0)
Si desea una duración de tarea infinita en Windows 10, simplemente use esto (No especifique -RepetitionDuration)
$action = New-ScheduledTaskAction -Execute (Resolve-Path ''./main.exe'')
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1)
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "GettingDataFromDB" -Description "Dump of new data every hour"