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 .