Share via


about_Scheduled_Jobs_Troubleshooting

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.

Para obtener más información sobre los cmdlets incluidos en el módulo PSScheduledJob , consulte PSScheduledJob.

No se pueden encontrar los resultados del trabajo

Método básico para obtener resultados de 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 comando siguiente obtiene los resultados de la instancia más reciente de 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 de 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 siguiente ruta de acceso:

$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

Es posible que el cmdlet Receive-Job ya haya 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 de nuevo los resultados de la instancia de trabajo, escriba 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 hacer 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 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 cmdlet elimina los resultados del Remove-Job trabajo. Cuando se usa Remove-Job para eliminar un trabajo programado, elimina 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 los desencadenadores del trabajo 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 requiera que el equipo esté inactivo o que requiera una conexión de red, o que tenga un valor de IdleDuration largo o un breve idleTimeout nunca se ejecute.

Use el Get-ScheduledJobOption cmdlet para examinar las opciones de trabajo y sus valores.

Get-ScheduledJobOption -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 del 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 en el 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 .

Consulte también