Private/Wissen/B_Basic/B44_Task.ps1

<#
 
# (Scheduled) Job's und (Scheduled) Task
 
# 'Langanhaltende' Aufgaben zeigesteuert und paarallel auszulagern.
 
- **Hashtags** Scheduled Task Job Parallel
 
- **Version** 2020.05.22
 
#>


#region Hintergrundaufgabe (Job)

# ! Ein Job kann einen Befehl oder Ausdruck im Hintergrund ausführen ohne mit der aktuellen Sitzung zu interagieren zu müssen.

# READ Weiterführende und Nachschlage-Informationen:

Get-Help -Name 'about_Jobs' -ShowWindow
Get-Help -Name 'about_Job_Details' -ShowWindow
Get-Command -Noun 'Job' -Module 'Microsoft.PowerShell.Core'

# ! Beispiele:

Start-Job -Name 'MyJob' -ScriptBlock { Get-Process | ForEach-Object -Process { "Bearbeite $($_.Name) Prozess!" | Write-Warning ; Start-Sleep -Milliseconds 100 } }

Get-Job -Name 'MyJob'

Receive-Job -Name 'MyJob'
Receive-Job -Name 'MyJob' -Keep

Stop-Job -Name 'MyJob'
Wait-Job -Name 'MyJob'

Remove-Job -Name 'MyJob'

# TIPP - Eininge Cmdlets bieten eine direkt Unterstützung von Jobs an:

Get-Help -Name '*' -Parameter 'AsJob'

#endregion

#region Zeitgesteuerte Hintergrundaufgaben (PSScheduledJob)

# ! Admin-Rechte werden benötigt

# READ Weiterführende und Nachschlage-Informationen:

Get-Help -Name 'about_Scheduled_Jobs' -ShowWindow
Get-Help -Name 'about_Scheduled_Jobs_Advanced' -ShowWindow
Get-Help -Name 'about_Scheduled_Jobs_Basics' -ShowWindow
Get-Help -Name 'about_Scheduled_Jobs_Troubleshooting' -ShowWindow
Get-Command -Module 'PSScheduledJob'
Schtasks.exe

# ! Einrichten:

$trigger = New-JobTrigger -Daily -At '03:00'
$options = New-ScheduledJobOption -StartIfOnBattery
Register-ScheduledJob -Name 'MyScheduledJob' -ScriptBlock { Get-Process } -Trigger $trigger -ScheduledJobOption $options

# ! Überwachen:

Get-ScheduledJob
Get-JobTrigger -Name 'MyScheduledJob'

# ! Verwalten:

Get-ScheduledJob -Name 'MyScheduledJob' | Get-ScheduledJobOption | Set-ScheduledJobOption -ContinueIfGoingOnBattery -PassThru

# ! Löschen:

Unregister-ScheduledJob -Name 'MyScheduledJob'

#endregion

#region Windows Aufgabenplanung (ScheduledTasks)

# READ Weiterführende und Nachschlage-Informationen:

Get-Command -Module 'ScheduledTasks'

# ! Scheduled-Task einrichten:

$action    = New-ScheduledTaskAction –Execute 'notepad.exe'
$trigger   = New-ScheduledTaskTrigger -At '2019-10-10 12:25' -Once
$principal = New-ScheduledTaskPrincipal -UserId 'Attila' -LogonType Interactive
$settings  = New-ScheduledTaskSettingsSet -WakeToRun
$task      = New-ScheduledTask -Action $action -Trigger $trigger -Principal $principal -Settings $settings
$task | Register-ScheduledTask -TaskName '_Test'

# ! Status eines scheduled Task abfragen:

Get-ScheduledTask -TaskName '_Test'
Get-ScheduledTaskInfo -TaskName '_Test'

# ! Scheduled Task wieder entfernen:

Unregister-ScheduledTask -TaskName '_Test' -Confirm:$false

# ! Scheduled Task exportieren bzw. importieren:

Export-ScheduledTask -TaskName '_Test' -TaskPath . | Out-File -FilePath 'C:\Temp\_Test.xml'

Register-ScheduledTask -Xml (Get-Content 'C:\Temp\_Test.xml' | Out-String) -TaskName '_Test' -TaskPath '\TASK-PATH-TASKSCHEDULER\' -User 'COMPUTER-NAME\USER-NAME' –Force

#endregion

#region Parallele Verarbeitung

# ! Die parallele Verarbeitung mittels ForEach-Object -Parallel ist seit der PowerShell 7 möglich:

Get-Help -Name 'ForEach-Object' -ShowWindow

# ! Langsam:
1..8 | ForEach-Object -Process { "Verarbeite Schritt $_" | Write-Warning ; Start-Sleep -Seconds 1 }
# TIPP Schnell:
1..8 | ForEach-Object -Parallel { "Verarbeite Schritt $_" | Write-Warning ; Start-Sleep -Seconds 1 } -ThrottleLimit 4

#endregion

# TODO QUIZ - https://attilakrick.com/schlagwort/powershell-jobs-und-tasks/