about_Scheduled_Jobs_Troubleshooting

Descrizione breve

Spiega come risolvere i problemi relativi ai processi pianificati

Descrizione lunga

Questo documento descrive alcuni dei problemi che possono verificarsi quando si usano le funzionalità di processo pianificate di PowerShell e suggerisce soluzioni a questi problemi.

Prima di usare i processi pianificati di PowerShell, vedere about_Scheduled_Jobs e i processi pianificati correlati sugli argomenti.

Per altre informazioni sui cmdlet contenuti nel modulo PSScheduledJob , vedere PSScheduledJob.

Non è possibile trovare i risultati del processo

Metodo di base per ottenere i risultati dei processi in PowerShell

Quando viene eseguito un processo pianificato, crea un'istanza del processo pianificato. Per visualizzare, gestire e ottenere i risultati delle istanze di processo pianificate, usare i cmdlet job.

Nota

Per usare i cmdlet Job nelle istanze di processi pianificati, è necessario importare il modulo PSScheduledJob nella sessione. Per importare il modulo PSScheduledJob , digitare Import-Module PSScheduledJob o usare qualsiasi cmdlet di processo pianificato, ad esempio Get-ScheduledJob.

Per ottenere un elenco di tutte le istanze di un processo pianificato, usare il 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

Il Get-Job cmdlet invia oggetti ProcessJob nella pipeline. Il Format-Table cmdlet visualizza le proprietà Name, ID e PSBeginTime di un'istanza di processo pianificata in una tabella.

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

Per ottenere i risultati di un'istanza di un processo pianificato, usare il Receive-Job cmdlet . Il comando seguente ottiene i risultati dell'istanza più recente di ProcessJob (ID = 50).

Receive-Job -ID 50

Metodo di base per la ricerca dei risultati dei processi su disco

Per gestire i processi pianificati, usare i cmdlet del processo, ad esempio Get-Job e Receive-Job.

Se Get-Job non ottiene l'istanza del processo o Receive-Job non ottiene i risultati del processo, è possibile cercare il processo su disco nei file della cronologia di esecuzione. La cronologia di esecuzione contiene un record di tutte le istanze di processo attivate.

Verificare che nella directory sia presente una directory denominata timestamp per un processo pianificato nel percorso seguente:

$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output

Ad esempio:

C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output

Ad esempio, il Get-ChildItem cmdlet ottiene la cronologia di esecuzione su disco del processo pianificato 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

Ogni directory denominata timestamp rappresenta un'istanza del processo. I risultati di ogni istanza del processo vengono salvati in un file Results.xml nella directory denominata timestamp.

Ad esempio, il comando seguente ottiene i file di Results.xml per ogni istanza salvata del processo pianificato ProcessJob . Se il file Results.xml è mancante, PowerShell non può restituire o visualizzare i risultati del processo.

$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

Il cmdlet del processo potrebbe non essere in grado di ottenere istanze di processo pianificate o i relativi risultati perché il modulo PSScheduledJob non viene importato nella sessione.

Nota

Prima di usare un cmdlet di processo nelle istanze di processo pianificate, verificare che il modulo PSScheduledJob sia incluso nella sessione. Senza il modulo PSScheduledJob , i cmdlet del processo non possono ottenere istanze di processo pianificate o i relativi risultati.

Per importare il modulo PSScheduledJob :

Import-Module PSScheduledJob

Il cmdlet Receive-Job potrebbe avere già restituito i risultati

Se Receive-Job non restituisce i risultati dell'istanza del processo, è possibile che sia stato eseguito un Receive-Job comando per tale istanza del processo nella sessione corrente senza il parametro Keep .

Quando si usa Receive-Job senza il parametro Keep, Receive-Job restituisce i risultati del processo e imposta la proprietà HasMoreData dell'istanza del processo su False. Il valore False indica che Receive-Job sono stati restituiti i risultati del processo e che l'istanza non ha più risultati da restituire. Questa impostazione è appropriata per i processi in background standard, ma non per le istanze di processi pianificati, che vengono salvate su disco.

Per ottenere di nuovo i risultati dell'istanza del processo, avviare una nuova sessione di PowerShell digitando PowerShell. Importare il modulo PSScheduledJob e riprovare.Receive-Job

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 parametro Keep per ottenere risultati più volte in una sessione

Per ottenere il risultato di un'istanza del processo più volte in una sessione, usare il parametro 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

Il processo pianificato potrebbe essere danneggiato

Se un processo pianificato diventa danneggiato, PowerShell elimina il processo pianificato danneggiato e i relativi risultati. Non è possibile recuperare i risultati di un processo pianificato danneggiato.

Per determinare se esiste ancora un processo pianificato, usare il Get-ScheduledJob cmdlet .

Get-ScheduledJob

Il numero di risultati potrebbe aver superato ExecutionHistoryLength

La proprietà ExecutionHistoryLength di un processo pianificato determina il numero di istanze del processo e i relativi risultati vengono salvati su disco. Il valore predefinito è (32). Quando il numero di istanze di un processo pianificato supera questo valore, PowerShell elimina l'istanza del processo meno recente per liberare spazio per ogni nuova istanza del processo.

Per ottenere il valore della proprietà ExecutionHistoryLength di un processo pianificato, usare il formato di comando seguente:

(Get-ScheduledJob <JobName>).ExecutionHistoryLength

Ad esempio, il comando seguente ottiene il valore della proprietà ExecutionHistoryLength del processo pianificato ProcessJob .

(Get-ScheduledJob ProcessJob).ExecutionHistoryLength

Per impostare o modificare il valore della proprietà ExecutionHistoryLength , utilizzare il parametro MaxResultCount dei Register-ScheduledJob cmdlet e Set-ScheduledJob .

Il comando seguente aumenta il valore della proprietà ExecutionHistoryLength a 50.

Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50

I risultati dell'istanza del processo potrebbero essere stati eliminati

Il parametro ClearExecutionHistory del Set-ScheduledJob cmdlet elimina la cronologia di esecuzione di un processo. È possibile usare questa funzionalità per liberare spazio su disco o eliminare risultati non necessari o già usati, analizzati o salvati in un percorso diverso.

Per eliminare la cronologia di esecuzione di un processo pianificato, usare il parametro ClearExecutionHistory del processo pianificato.

Il comando seguente elimina la cronologia di esecuzione del processo pianificato ProcessJob .

Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory

Inoltre, il Remove-Job cmdlet elimina i risultati del processo. Quando si usa Remove-Job per eliminare un processo pianificato, elimina tutte le istanze del processo su disco, inclusa la cronologia di esecuzione e tutti i risultati del processo.

I processi avviati con il cmdlet Start-Job non vengono salvati su disco

Quando si usa Start-Job per avviare un processo pianificato, anziché usare un trigger di processo, Start-Job avvia un processo in background standard. Il processo in background e i relativi risultati non vengono archiviati nella cronologia di esecuzione del processo su disco.

È possibile usare il Get-Job cmdlet per ottenere il processo e il Receive-Job cmdlet per ottenere i risultati del processo, ma i risultati sono disponibili solo fino a quando non vengono ricevuti, a meno che non si usi il parametro Keep del Receive-Job cmdlet.

Inoltre, i processi in background e i relativi risultati sono specifici della sessione; esistono solo nella sessione in cui vengono creati. Se si elimina il processo con Remove-Job, chiudere la sessione o chiudere PowerShell, l'istanza del processo e i relativi risultati vengono eliminati.

Il processo pianificato non viene eseguito

I processi pianificati non vengono eseguiti automaticamente se i trigger del processo o il processo pianificato sono disabilitati.

Usare il Get-ScheduledJob cmdlet per ottenere il processo pianificato. Verificare che il valore della proprietà Enabled del processo pianificato sia True.

Get-ScheduledJob ProcessJob
Id         Name            Triggers        Command         Enabled
--         ----            --------        -------         -------
4          ProcessJob      {1, 2}          Get-Process     True
(Get-ScheduledJob ProcessJob).Enabled
True

Usare il Get-JobTrigger cmdlet per ottenere i trigger di processo del processo pianificato. Verificare che il valore della proprietà Enabled del trigger di processo sia 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

I processi pianificati non vengono eseguiti automaticamente se i trigger di processo non sono validi

Ad esempio, un trigger di processo potrebbe specificare una data nel passato o una data che non si verifica, ad esempio il 5° lunedì del mese.

I processi pianificati non vengono eseguiti automaticamente se le condizioni del trigger di processo o le opzioni del processo non sono soddisfatte.

Ad esempio, un processo pianificato che viene eseguito solo quando un determinato utente accede al computer non verrà eseguito se tale utente non esegue l'accesso o si connette solo in remoto.

Esaminare le opzioni del processo pianificato e assicurarsi che siano soddisfatte. Ad esempio, un processo pianificato che richiede che il computer sia inattiva o richieda una connessione di rete o abbia un idleDuration lungo o un breve IdleTimeout potrebbe non essere mai eseguito.

Usare il Get-ScheduledJobOption cmdlet per esaminare le opzioni del processo e i relativi valori.

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

Per le descrizioni delle opzioni di processo pianificate, vedere New-ScheduledJobOption.

L'istanza del processo pianificata potrebbe avere avuto esito negativo

Se un comando di processo pianificato ha esito negativo, PowerShell lo segnala immediatamente generando un messaggio di errore. Tuttavia, se il processo non riesce quando l'Utilità di pianificazione tenta di eseguirla, l'errore non è disponibile per PowerShell.

Usare i metodi seguenti per rilevare e correggere gli errori del processo:

Controllare la presenza di errori nel registro eventi dell'Utilità di pianificazione. Per controllare il log, usare Visualizzatore eventi o un comando di PowerShell, ad esempio:

Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
 Where {$_.Message -like "fail"}

Controllare il record del processo in Utilità di pianificazione. I processi pianificati di PowerShell vengono archiviati nella seguente cartella Attività pianificata:

Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs

Il processo pianificato potrebbe non essere eseguito a causa di autorizzazioni insufficienti

I processi pianificati vengono eseguiti con le autorizzazioni dell'utente che ha creato il processo o le autorizzazioni dell'utente specificato dal parametro Credential nel Register-ScheduledJob comando o Set-ScheduledJob .

Se l'utente non dispone dell'autorizzazione per eseguire i comandi o gli script, il processo ha esito negativo.

Non è possibile ottenere un processo pianificato o un processo pianificato danneggiato

In rari casi, i processi pianificati possono diventare danneggiati o contenere contraddizioni interne che non possono essere risolte. In genere, ciò si verifica quando i file XML per il processo pianificato vengono modificati manualmente, con conseguente xml non valido.

Quando un processo pianificato è danneggiato, PowerShell tenta di eliminare il processo pianificato, la cronologia di esecuzione e i risultati dal disco.

Se non è possibile rimuovere il processo pianificato, viene visualizzato un messaggio di errore del processo danneggiato ogni volta che si esegue il Get-ScheduledJob cmdlet.

Per rimuovere un processo pianificato danneggiato, utilizzare uno dei metodi seguenti:

Eliminare la <ScheduledJobName> directory per il processo pianificato. Non eliminare la directory ScheduledJob .

Percorso della directory:

$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>

Ad esempio:

C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>.

Usare Utilità di pianificazione per eliminare il processo pianificato. Le attività pianificate di PowerShell vengono visualizzate nel percorso dell'Utilità di pianificazione seguente:

Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>

I cmdlet del processo non sono in grado di trovare in modo coerente i processi pianificati

Quando il modulo PSScheduledJob non è presente nella sessione corrente, i cmdlet del processo non possono ottenere processi pianificati, avviarli o ottenere i risultati.

Per importare il modulo PSScheduledJob , digitare Import-Module PSScheduledJob o eseguire o ottenere qualsiasi cmdlet nel modulo, ad esempio il Get-ScheduledJob cmdlet . A partire da PowerShell 3.0, i moduli vengono importati automaticamente quando si ottiene o si usa qualsiasi cmdlet nel modulo.

Quando il modulo PSScheduledJob non è presente nella sessione corrente, è possibile eseguire la sequenza di comando seguente.

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

Questo comportamento si verifica perché il Get-ScheduledJob comando importa automaticamente il modulo PSScheduledJob e quindi esegue il comando .

Vedi anche