PowerShell ile Zamanlanmış Görevler Nasıl Oluşturulur ve Yönetilir?


Çoğu kullanıcı ve yönetici,

taskschd.msc

Windows'ta zamanlanmış görevleri oluşturmak ve yönetmek için grafik arayüz konsolu. Ancak, çeşitli betiklerde ve otomatikleştirilmiş akışlarda, zamanlanmış görevler oluşturmak için PowerShell özelliklerini kullanmak çok daha uygundur. Bu makalede, PowerShell kullanarak Windows Zamanlayıcı görevlerinin nasıl oluşturulacağını ve yönetileceğini göstereceğiz.

PowerShell aracılığıyla Windows'ta Zamanlanmış Görevleri Yönetme

ScheduledTasks PowerShell modülü, Windows 10/Windows Server 2016'da zamanlanmış görevleri yönetmek için kullanılır. Bir modüldeki cmdlet'leri aşağıdaki gibi listeleyebilirsiniz:

Get-Command -Module ScheduledTasks
  • Disable-ScheduledTask
  • Enable-ScheduledTask
  • Export-ScheduledTask
  • Get-ClusteredScheduledTask
  • Get-ScheduledTask
  • Get-ScheduledTaskInfo
  • New-ScheduledTask
  • New-ScheduledTaskAction
  • New-ScheduledTaskPrincipal
  • New-ScheduledTaskSettingsSet
  • New-ScheduledTaskTrigger
  • Register-ClusteredScheduledTask
  • Register-ScheduledTask
  • Set-ClusteredScheduledTask
  • Set-ScheduledTask
  • Start-ScheduledTask
  • Stop-ScheduledTask
  • Unregister-ClusteredScheduledTask
  • Unregister-ScheduledTask

İpucu. Önceden, yerleşik konsol aracı

schtasks.exe

Windows'ta zamanlayıcı işleri oluşturmak ve yönetmek için kullanıldı.

Windows PowerShell ile Zamanlanmış Görev Oluşturma

PowerShell'in modern sürümlerinde (Windows Server 2012/Windows 8'de PowerShell 3.0 ile başlayarak), zamanlanmış görevler oluşturmak için New-ScheduledTaskTrigger ve Register-ScheduledTask cmdlet'lerini kullanabilirsiniz.

Başlatma sırasında (veya belirli bir zamanda) çalışması gereken zamanlanmış bir görev oluşturmamız ve bazı PowerShell betiğini veya komutunu yürütmemiz gerektiğini varsayalım. StartupScript1 adlı zamanlanmış bir görev oluşturalım. Bu görev, her gün saat 10:00'da PowerShell betik dosyası C:\PS\StartupScript.ps1'i çalıştırmalıdır. Görev, SYSTEM hesabı altında yükseltilmiş ayrıcalıklarla ("En yüksek ayrıcalıklarla çalıştır" onay kutusu) yürütülecektir.

$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript1.ps1"
Register-ScheduledTask -TaskName "StartupScript1" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest -Force

Görev başarıyla oluşturulduysa "Hazır" durumu görünür.

PowerShell betiğiniz belirtilen zamanlamaya göre çalışacaktır. Bilgisayarınızda PS1 komut dosyalarının yürütülmesini engelleyen etkin bir PowerShell Yürütme İlkesi varsa, zamanlanmış bir görevden bir PowerShell komut dosyasını çalıştırabilirsiniz.

-Bypass

parametre.

Yeni bir görev oluştururken bu kodu kullanın:

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument “-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"

İpucu. Görevin bilgisayar başlatılırken her seferinde çalışmasını istiyorsanız, ilk komutun aşağıdaki gibi olması gerekir:

$Trigger= New-ScheduledTaskTrigger -AtStartup

Bir kullanıcı oturum açtığında bir görevi çalıştırmak istiyorsanız:

$Trigger= New-ScheduledTaskTrigger -AtLogon

Aç

taskschd.msc

konsola gidin ve Görev Zamanlayıcı Kitaplığı'nda yeni bir zamanlayıcı göreviniz olduğundan emin olun.

Powershell 2.0'da (Windows 7, Windows Server 2008 R2), PowerShell'den zamanlanmış bir görev oluşturmak için Schedule.Service COM arayüzünü kullanabilirsiniz (veya PowerShell sürümünü güncelleyebilirsiniz). Bu örnekte, başlatma sırasında PowerShell betiğini içeren belirli dosyayı yürütecek zamanlanmış bir görev oluşturuyoruz. Görev ile gerçekleştirilir

NT AUTHORITY\SYSTEM

ayrıcalıklar.

$TaskName = "NewPsTask"
$TaskDescription = "Running PowerShell script from Task Scheduler"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rootFolder = $service.GetFolder("\")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
#http://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(8)

PowerShell ile Zamanlanmış Görevler Nasıl Görüntülenir ve Çalıştırılır?

Windows'ta tüm etkin zamanlanmış görevleri şu komutla listeleyebilirsiniz:

Get-ScheduledTask -TaskPath | ? state -ne Disabled

Belirli bir görev hakkında bilgi almak için:

Get-ScheduledTask CheckServiceState| Get-ScheduledTaskInfo
LastRunTime : 4/7/2021 10:00:00 AM
LastTaskResult : 267011
NextRunTime : 4/8/2021 10:00:00 AM
NumberOfMissedRuns : 0
TaskName : CheckServiceState
TaskPath : \
PSComputerName :

Bu görevi devre dışı bırakabilirsiniz:

Get-ScheduledTask CheckServiceState | Disable-ScheduledTask

Bir görevi etkinleştirmek için:

Get-ScheduledTask CheckServiceState | Enable-ScheduledTask

Görevi hemen çalıştırmak için (zamanlamayı beklemeden) şunu çalıştırın:

Start-ScheduledTask CheckServiceState

Görev Zamanlayıcı kitaplığından bir görevi tamamen kaldırmak için:

Unregister-ScheduledTask -TaskName CheckServiceState

Görevin başlatıldığı kullanıcı adını ve örneğin uyumluluk modunu değiştirmeniz gerekirse, Set-ScheduledTask cmdlet'i kullanın:

$task_user = New-ScheduledTaskPrincipal -UserId a-d\j.abrams' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings

" hatasını alırsanız

Set-ScheduledTask: No mapping between account names and security IDs was done

” doğru kullanıcı adını verdiğinizi kontrol edin.

Zamanlanmış Görevler XML Dosyaları Yoluyla Nasıl Dışa Aktarılır ve İçe Aktarılır?

PowerShell, herhangi bir zamanlanmış görevin geçerli ayarlarını bir metin XML dosyasına aktarmanıza olanak tanır. Böylece, herhangi bir görevin parametrelerini dışa aktarabilir ve bir görevi diğer bilgisayarlara dağıtabilirsiniz. Görev, hem Görev Zamanlayıcı GUI'sinden hem de PowerShell konsolundan dışa aktarılabilir.

StartupScript adlı görevi StartupScript.xml dosyasına aktarma komutu şöyledir:

Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml

Export-ScheduledTask cmdlet'i PowerShell 2.0'da mevcut değildir, bu nedenle Windows 7/Windows Server 2008 R2'de görev ayarlarını dışa aktarmak ve sonucu bir metne yönlendirmek için yerleşik schtasks aracını kullanmak daha iyidir dosya:

schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"

Zamanlanmış görev ayarları XML dosyasına aktarıldıktan sonra GUI, SchTasks.exe veya PowerShell kullanılarak herhangi bir ağ bilgisayarına alınabilir.

Register-ScheduledTask cmdlet'i, görev ayarlarını bir XML dosyasından içe aktarmanıza ve kaydetmenize yardımcı olabilir:

Register-ScheduledTask -Xml (Get-Content “\\mun-fs01\public\NewPsTask.xml” | out-string) -TaskName "NewPsTask"

PowerShell 2.0'da (Windows 7/Server 2008 R2), schtasks aracını kullanarak bir görevi içe aktarmak daha kolaydır. İlk komut yeni bir görev oluşturur. İkincisi onu hemen çalıştıracaktır (olay tetikleyicinin onu etkinleştirmesini beklemeden).

schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"

Lütfen bu örneğin, görevi çalıştırmak için kullanılan hesabın kimlik bilgilerini kullandığını unutmayın. Kimlik bilgileri işte saklanmadıkları için belirtilmezse, içe aktarma sırasında istenecektir.

İlgili makaleler