Acerca de la solución de problemas de trabajos programados
Descripción breve
Explica cómo resolver problemas con trabajos programados
Descripción larga
En este documento se describen algunos de los problemas que puede experimentar al usar las características de trabajo programadas de PowerShell y se sugieren soluciones a estos problemas.
Antes de usar trabajos programados de PowerShell, consulte about_Scheduled_Jobs y los trabajos programados relacionados sobre temas.
No se pueden encontrar los resultados del trabajo
Método básico para obtener los resultados del trabajo en PowerShell
Cuando se ejecuta un trabajo programado, crea una instancia del trabajo programado. Para ver, administrar y obtener los resultados de las instancias de trabajo programadas, use los cmdlets job.
Nota
Para usar los cmdlets job en instancias de trabajos programados, el módulo PSScheduledJob debe importarse en la sesión. Para importar el módulo PSScheduledJob , escriba Import-Module PSScheduledJob
o use cualquier cmdlet de trabajo programado, como Get-ScheduledJob
.
Para obtener una lista de todas las instancias de un trabajo programado, use el Get-Job
cmdlet .
Import-Module PSScheduledJob
Get-Job ProcessJob
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
43 ProcessJob PSScheduledJob Completed False localhost
44 ProcessJob PSScheduledJob Completed False localhost
45 ProcessJob PSScheduledJob Completed False localhost
46 ProcessJob PSScheduledJob Completed False localhost
47 ProcessJob PSScheduledJob Completed False localhost
48 ProcessJob PSScheduledJob Completed False localhost
49 ProcessJob PSScheduledJob Completed False localhost
50 ProcessJob PSScheduledJob Completed False localhost
El Get-Job
cmdlet envía objetos ProcessJob a la canalización. El Format-Table
cmdlet muestra las propiedades Name, ID y PSBeginTime de una instancia de trabajo programada en una tabla.
Get-Job ProcessJob | Format-Table -Property Name, ID, PSBeginTime -Auto
Name Id PSBeginTime
---- -- ---------
ProcessJob 43 11/2/2011 3:00:02 AM
ProcessJob 44 11/3/2011 3:00:02 AM
ProcessJob 45 11/4/2011 3:00:02 AM
ProcessJob 46 11/5/2011 3:00:02 AM
ProcessJob 47 11/6/2011 3:00:02 AM
ProcessJob 48 11/7/2011 12:00:01 AM
ProcessJob 49 11/7/2011 3:00:02 AM
ProcessJob 50 11/8/2011 3:00:02 AM
Para obtener los resultados de una instancia de un trabajo programado, use el Receive-Job
cmdlet . El siguiente comando obtiene los resultados de la instancia más reciente del ProcessJob (ID = 50).
Receive-Job -ID 50
Método básico para buscar resultados del trabajo en el disco
Para administrar trabajos programados, use los cmdlets de trabajo, como Get-Job
y Receive-Job
.
Si Get-Job
no obtiene la instancia del trabajo o Receive-Job
no obtiene los resultados del trabajo, puede buscar los archivos del historial de ejecución del trabajo en el disco.
El historial de ejecución contiene un registro de todas las instancias de trabajo desencadenadas.
Compruebe que hay un directorio con nombre de marca de tiempo en el directorio para un trabajo programado en la ruta de acceso siguiente:
$home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob <ScheduledJobName>\Output
Por ejemplo:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob <ScheduledJobName>\Output
Por ejemplo, el Get-ChildItem
cmdlet obtiene el historial de ejecución en disco del trabajo programado ProcessJob .
$Path = '$home\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output'
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/2/2011 3:00 AM 20111102-030002-260
d---- 11/3/2011 3:00 AM 20111103-030002-277
d---- 11/4/2011 3:00 AM 20111104-030002-209
d---- 11/5/2011 3:00 AM 20111105-030002-251
d---- 11/6/2011 3:00 AM 20111106-030002-174
d---- 11/7/2011 12:00 AM 20111107-000001-914
d---- 11/7/2011 3:00 AM 20111107-030002-376
Cada directorio con nombre de marca de tiempo representa una instancia de trabajo. Los resultados de cada instancia de trabajo se guardan en un archivo Results.xml en el directorio con nombre de marca de tiempo.
Por ejemplo, el siguiente comando obtiene los archivos Results.xml para cada instancia guardada del trabajo programado ProcessJob . Si falta el archivo Results.xml , PowerShell no puede devolver ni mostrar los resultados del trabajo.
$Path = '$home\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output\*\Results.xml'
Get-ChildItem $Path
Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output
Es posible que el cmdlet de trabajo no pueda obtener instancias de trabajo programadas o sus resultados porque el módulo PSScheduledJob no se importa en la sesión.
Nota
Antes de usar un cmdlet de trabajo en instancias de trabajo programadas, compruebe que el módulo PSScheduledJob se incluye en la sesión. Sin el módulo PSScheduledJob , los cmdlets de trabajo no pueden obtener instancias de trabajo programadas ni sus resultados.
Para importar el módulo PSScheduledJob :
Import-Module PSScheduledJob
Receive-Job cmdlet podría haber devuelto los resultados
Si Receive-Job
no devuelve resultados de la instancia de trabajo, puede deberse a que se ha ejecutado un Receive-Job
comando para esa instancia de trabajo en la sesión actual sin el parámetro Keep .
Cuando se usa Receive-Job
sin el parámetro Keep , Receive-Job
devuelve los resultados del trabajo y establece la propiedad HasMoreData de la instancia de trabajo en False. El valor False significa que Receive-Job
devolvió los resultados del trabajo y la instancia no tiene más resultados para devolver. Esta configuración es adecuada para los trabajos en segundo plano estándar, pero no para las instancias de trabajos programados, que se guardan en el disco.
Para obtener los resultados de la instancia de trabajo de nuevo, inicie una nueva sesión de PowerShell escribiendo PowerShell
. Importe el módulo PSScheduledJob e inténtelo Receive-Job
de nuevo.
Receive-Job -ID 50
#No results
PowerShell.exe
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.
Import-Module PSScheduledJob
Receive-Job -ID 50
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Uso del parámetro Keep para obtener resultados más de una vez en una sesión
Para obtener el resultado de una instancia de trabajo más de una vez en una sesión, use el parámetro Keep del Receive-Job
cmdlet .
Import-Module PSScheduledJob
Receive-Job -ID 50 -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Receive-Job -ID 50 -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Es posible que el trabajo programado esté dañado.
Si un trabajo programado se daña, PowerShell elimina el trabajo programado dañado y sus resultados. No se pueden recuperar los resultados de un trabajo programado dañado.
Para determinar si todavía existe un trabajo programado, use el Get-ScheduledJob
cmdlet .
Get-ScheduledJob
Es posible que el número de resultados haya superado executionHistoryLength.
La propiedad ExecutionHistoryLength de un trabajo programado determina cuántas instancias de trabajo y sus resultados se guardan en el disco. El valor predeterminado es 32. Cuando el número de instancias de un trabajo programado supera este valor, PowerShell elimina la instancia de trabajo más antigua para dejar espacio para cada nueva instancia de trabajo.
Para obtener el valor de la propiedad ExecutionHistoryLength de un trabajo programado, use el siguiente formato de comando:
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
Por ejemplo, el siguiente comando obtiene el valor de la propiedad ExecutionHistoryLength del trabajo programado ProcessJob .
(Get-ScheduledJob ProcessJob).ExecutionHistoryLength
Para establecer o cambiar el valor de la propiedad ExecutionHistoryLength , use el parámetro MaxResultCount de los Register-ScheduledJob
cmdlets y Set-ScheduledJob
.
El siguiente comando aumenta el valor de la propiedad ExecutionHistoryLength a 50.
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
Es posible que se hayan eliminado los resultados de la instancia de trabajo.
El parámetro ClearExecutionHistory del Set-ScheduledJob
cmdlet elimina el historial de ejecución de un trabajo. Puede usar esta característica para liberar espacio en disco o eliminar los resultados que no son necesarios o que ya se han usado, analizados o guardados en otra ubicación.
Para eliminar el historial de ejecución de un trabajo programado, use el parámetro ClearExecutionHistory del trabajo programado.
El siguiente comando elimina el historial de ejecución del trabajo programado ProcessJob .
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
Además, el Remove-Job
cmdlet elimina los resultados del trabajo. Cuando se usa Remove-Job
para eliminar un trabajo programado, se eliminan todas las instancias del trabajo en el disco, incluido el historial de ejecución y todos los resultados del trabajo.
Los trabajos iniciados mediante el cmdlet Start-Job no se guardan en el disco
Cuando se usa Start-Job
para iniciar un trabajo programado, en lugar de usar un desencadenador de trabajo, Start-Job
se inicia un trabajo en segundo plano estándar. El trabajo en segundo plano y sus resultados no se almacenan en el historial de ejecución del trabajo en disco.
Puede usar el Get-Job
cmdlet para obtener el trabajo y el Receive-Job
cmdlet para obtener los resultados del trabajo, pero los resultados solo están disponibles hasta que los reciba, a menos que use el parámetro Keep del Receive-Job
cmdlet.
Además, los trabajos en segundo plano y sus resultados son específicos de la sesión; solo existen en la sesión en la que se crean. Si elimina el trabajo con Remove-Job
, cierre la sesión o cierre PowerShell, se eliminará la instancia de trabajo y sus resultados.
El trabajo programado no se ejecuta
Los trabajos programados no se ejecutan automáticamente si el trabajo se desencadena o el trabajo programado están deshabilitados.
Use el Get-ScheduledJob
cmdlet para obtener el trabajo programado. Compruebe que el valor de la propiedad Enabled del trabajo programado es True.
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1, 2} Get-Process True
(Get-ScheduledJob ProcessJob).Enabled
True
Use el Get-JobTrigger
cmdlet para obtener los desencadenadores de trabajo del trabajo programado.
Compruebe que el valor de la propiedad Enabled del desencadenador de trabajo es True.
Get-ScheduledJob ProcessJob | Get-JobTrigger
Id Frequency Time DaysOfWeek Enabled
-- --------- ---- ---------- -------
1 Weekly 11/7/2011 5:00:00 AM {Monday, Thursday} True
2 Daily 11/7/2011 3:00:00 PM True
Get-ScheduledJob ProcessJob|Get-JobTrigger|Format-Table ID, Enabled -Auto
Id Enabled
-- -------
1 True
2 True
Los trabajos programados no se ejecutan automáticamente si los desencadenadores de trabajo no son válidos
Por ejemplo, un desencadenador de trabajo podría especificar una fecha en el pasado o una fecha que no se produzca, como el lunes 5 del mes.
Los trabajos programados no se ejecutan automáticamente si no se cumplen las condiciones del desencadenador de trabajo o las opciones de trabajo.
Por ejemplo, un trabajo programado que se ejecuta solo cuando un usuario determinado inicia sesión en el equipo no se ejecutará si ese usuario no inicia sesión o solo se conecta de forma remota.
Examine las opciones del trabajo programado y asegúrese de que están satisfechos. Por ejemplo, un trabajo programado que requiere que el equipo esté inactivo o que requiera una conexión de red, o que tenga un valor de IdleDuration largo o que un breve IdleTimeout nunca se ejecute.
Use el Get-ScheduledJobOption
cmdlet para examinar las opciones de trabajo y sus valores.
Get-ScheduledJob -Name ProcessJob
StartIfOnBatteries : False
StopIfGoingOnBatteries : True
WakeToRun : True
StartIfNotIdle : True
StopIfGoingOffIdle : False
RestartOnIdleResume : False
IdleDuration : 00:10:00
IdleTimeout : 01:00:00
ShowInTaskScheduler : True
RunElevated : False
RunWithoutNetwork : True
DoNotAllowDemandStart : False
MultipleInstancePolicy : IgnoreNew
JobDefinition : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition
Para obtener descripciones de las opciones de trabajo programadas, consulte New-ScheduledJobOption.
Es posible que se haya producido un error en la instancia de trabajo programada.
Si se produce un error en un comando de trabajo programado, PowerShell lo notifica inmediatamente mediante la generación de un mensaje de error. Sin embargo, si se produce un error en el trabajo cuando el Programador de tareas intenta ejecutarlo, el error no está disponible para PowerShell.
Use los métodos siguientes para detectar y corregir errores de trabajo:
Compruebe si hay errores en el registro de eventos del Programador de tareas. Para comprobar el registro, use Visor de eventos o un comando de PowerShell como el siguiente:
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
Where {$_.Message -like "fail"}
Compruebe el registro de trabajo en el Programador de tareas. Los trabajos programados de PowerShell se almacenan en la siguiente carpeta Programada de tareas:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
Es posible que el trabajo programado no se ejecute debido a un permiso insuficiente
Los trabajos programados se ejecutan con los permisos del usuario que creó el trabajo o los permisos del usuario especificado por el parámetro Credential en el Register-ScheduledJob
comando o Set-ScheduledJob
.
Si ese usuario no tiene permiso para ejecutar los comandos o scripts, se produce un error en el trabajo.
No se puede obtener el trabajo programado o el trabajo programado está dañado
En raras ocasiones, los trabajos programados pueden dañarse o contener contradicción internas que no se pueden resolver. Normalmente, esto sucede cuando los archivos XML para el trabajo programado se editan manualmente, lo que da lugar a XML no válido.
Cuando un trabajo programado está dañado, PowerShell intenta eliminar el trabajo programado, su historial de ejecución y sus resultados del disco.
Si no puede quitar el trabajo programado, recibirá un mensaje de error de trabajo dañado cada vez que ejecute el Get-ScheduledJob
cmdlet.
Para quitar un trabajo programado dañado, use uno de los métodos siguientes:
Elimine el <ScheduledJobName>
directorio del trabajo programado. No elimine el directorio ScheduledJob .
Ubicación del directorio:
$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell \ScheduledJobs<ScheduledJobName>
Por ejemplo:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ ScheduledJobs<ScheduledJobName>.
Use el Programador de tareas para eliminar el trabajo programado. Las tareas programadas de PowerShell aparecen en la siguiente ruta de acceso del Programador de tareas:
Task Scheduler Library\Microsoft\Windows\PowerShell \ScheduledJobs<ScheduledJobName>
Los cmdlets de trabajo no pueden encontrar trabajos programados de forma coherente
Cuando el módulo PSScheduledJob no está en la sesión actual, los cmdlets de trabajo no pueden obtener trabajos programados, iniciarlos ni obtener sus resultados.
Para importar el módulo PSScheduledJob , escriba Import-Module PSScheduledJob
o ejecute o obtenga cualquier cmdlet del módulo, como el Get-ScheduledJob
cmdlet .
A partir de PowerShell 3.0, los módulos se importan automáticamente al obtener o usar cualquier cmdlet del módulo.
Cuando el módulo PSScheduledJob no está en la sesión actual, es posible la siguiente secuencia de comandos.
Get-Job ProcessJob
Get-Job : The command cannot find the job because the job name
ProcessJob was not found.
Verify the value of the Name parameter, and then try the command again.
+ CategoryInfo : ObjectNotFound: (ProcessJob:String) [Get-Job],
PSArgumentException
+ FullyQualifiedErrorId : JobWithSpecifiedNameNotFound,Microsoft.PowerShell.
Commands.GetJobCommand
Get-Job
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1} Get-Process True
Get-Job ProcessJob
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
43 ProcessJob PSScheduledJob Completed True localhost
44 ProcessJob PSScheduledJob Completed True localhost
45 ProcessJob PSScheduledJob Completed True localhost
46 ProcessJob PSScheduledJob Completed True localhost
47 ProcessJob PSScheduledJob Completed True localhost
48 ProcessJob PSScheduledJob Completed True localhost
49 ProcessJob PSScheduledJob Completed True localhost
50 ProcessJob PSScheduledJob Completed True localhost
Este comportamiento se produce porque el Get-ScheduledJob
comando importa automáticamente el módulo PSScheduledJob y, a continuación, ejecuta el comando .