Microsoft Windows Task Scheduler (Görev Zamanlayıcı), bir programı veya PowerShell scriptini belirli bir zamanda ya da belirli koşullar oluştuğunda otomatik olarak çalıştırmanızı sağlar. Günlük raporlar, yedekleme kontrolleri, log temizliği veya Azure kaynaklarının durum raporları gibi tekrar eden işleri elle yapmak yerine Task Scheduler’a bırakabilirsiniz.
Kısa cevap: Task Scheduler’da yeni bir görev oluşturup Action bölümünde program olarak powershell.exe, argüman olarak da -NoProfile -ExecutionPolicy Bypass -File "C:\script\script.ps1" yazmanız yeterli. Aşağıda bu adımları ekran görüntüleriyle, ardından aynı işi PowerShell komutlarıyla nasıl yapacağınızı ve scriptin çalışmadığı durumlarda neye bakmanız gerektiğini anlatıyoruz.
Task Scheduler ile PowerShell Script Zamanlama Adımları
1. Task Scheduler konsolunu açın
Windows + R tuşlarına basıp açılan pencereye taskschd.msc yazarak Task Scheduler konsolunu açıyoruz.

Resim 01
2. Yeni görev oluşturun (General sekmesi)
Create Task seçeneğine tıklayıp yeni görev için bir ad ve açıklama giriyoruz. Bu sekmede iki ayar önemli:
- Run whether user is logged on or not: Görevin, bilgisayarda kimse oturum açmamış olsa da çalışmasını sağlar. Sunucularda zamanlanmış scriptler için neredeyse her zaman bu seçenek kullanılır.
- Run with highest privileges: Scriptin yönetici yetkisiyle çalışmasını sağlar. Script sistem ayarlarına, servislere veya korumalı klasörlere erişiyorsa bu kutuyu işaretleyin.
Örneğimizde görevi, kullanıcının oturum açmış olmasına bakılmaksızın çalıştırmak için bir servis hesabı atıyoruz. Kurumsal ortamlarda kişisel yönetici hesabı yerine görev için ayrı bir servis hesabı ya da gMSA (Group Managed Service Account) kullanmanızı öneririz; böylece parola değişikliği görevi bozmaz.

Resim 02
3. Tetikleyiciyi belirleyin (Triggers sekmesi)
Triggers sekmesine geçip New… butonuna tıklıyoruz. Burada görevi tetikleyen koşulları belirliyoruz: belirli bir zamanda, oturum açıldığında, bilgisayar boştayken, sistem başlangıcında veya belirli bir olay günlüğü kaydı oluştuğunda. Bu makalede görevimizin, Azure aboneliğimizdeki VM’lere ait günlük raporu her gün iletmesini istiyoruz.

Resim 03
On a schedule seçeneğini seçip sol taraftan Daily seçeneğini işaretliyoruz, görevin çalışmasını istediğimiz saati giriyoruz ve oluşturduğumuz tetikleyicinin Enabled kutusunun seçili olduğundan emin oluyoruz.

Resim 04
4. PowerShell scriptini tanımlayın (Actions sekmesi)
Actions sekmesine gelip New… butonuna tıklıyoruz.

Resim 05
Açılan pencerede alanları şu şekilde dolduruyoruz:
- Program/script:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe(PowerShell 7 kullanıyorsanızC:\Program Files\PowerShell\7\pwsh.exe) - Add arguments:
-NoProfile -ExecutionPolicy Bypass -File "C:\script\AzureVMReports.ps1" - Start in:
C:\script
Argümanlardaki -ExecutionPolicy Bypass, sunucudaki execution policy ayarı scriptin çalışmasını engellemesin diye yalnızca bu çalıştırma için politikayı atlar. -NoProfile ise PowerShell profilinin yüklenmesini engelleyerek görevin daha hızlı ve öngörülebilir çalışmasını sağlar. Dosya yolunu mutlaka tırnak içinde yazın; yolda boşluk varsa tırnaksız yazılan komut çalışmaz. Start in alanını doldurmak da, script içinde göreli dosya yolları kullanıyorsanız hataların önüne geçer.

Resim 06
5. Görevi kaydedin
Ayarları tamamladıktan sonra OK butonuna tıklıyoruz.

Resim 07
Bilgisayarda oturum açılmamışken de görevin çalışabilmesi için görevi çalıştıracak hesabın kullanıcı adı ve parolasını giriyoruz.

Resim 08
Görevimiz artık hazır. Listede görevi seçip sağ tıklayarak Run ile hemen bir test çalıştırması yapmanızı öneririz. Zamanını beklemeden scriptin sorunsuz çalıştığını bu şekilde doğrulayabilirsiniz.

Resim 09
Zamanlanmış Görevi PowerShell ile Oluşturmak
Aynı görevi birden fazla sunucuda oluşturmanız gerekiyorsa arayüz yerine PowerShell kullanmak çok daha pratik. Aşağıdaki örnek, scripti her gün saat 08:00’de en yüksek yetkiyle çalıştıran bir görev oluşturur:
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\script\AzureVMReports.ps1"' -WorkingDirectory "C:\script"
$trigger = New-ScheduledTaskTrigger -Daily -At 08:00
Register-ScheduledTask -TaskName "AzureVMReports" -Action $action -Trigger $trigger -User "DOMAIN\svc_task" -Password "Parola" -RunLevel Highest
Parolayı script içinde açık yazmak istemiyorsanız gMSA kullanabilirsiniz. Bu durumda görev hesabını şu şekilde tanımlarsınız; parola Active Directory tarafından otomatik yönetilir:
$principal = New-ScheduledTaskPrincipal -UserId "DOMAIN\gmsa_task$" -LogonType Password -RunLevel Highest
Register-ScheduledTask -TaskName "AzureVMReports" -Action $action -Trigger $trigger -Principal $principal
Zamanlanmış Görev Çalışıyor Ama Script Çalışmıyorsa
Sahada en sık karşılaşılan durum şu: Görev zamanında tetikleniyor, ama script beklenen işi yapmıyor. Bu durumda şu noktaları kontrol edin:
- Last Run Result değeri:
0x0başarılı çalıştığını,0x1scriptin hata ile sonlandığını,0x41301görevin hala çalışmakta olduğunu gösterir.0x1görüyorsanız sorun genellikle görevde değil, scriptin kendisindedir. - Execution policy: Argümanlarda
-ExecutionPolicy Bypassyoksa ve sunucuda politika kısıtlıysa script hiç çalışmaz. - Göreli dosya yolları: Script içinde
.\rapor.csvgibi göreli yollar kullanıyorsanız ve Start in alanı boşsa, script dosyalarıC:\Windows\System32altında arar. Tam yol kullanın ya da Start in alanını doldurun. - Ağ sürücüleri: Görev arka planda çalıştığında kullanıcı oturumundaki eşlenmiş sürücüler (Z:\ gibi) görünmez. Script içinde
\\sunucu\paylasimşeklinde UNC yolu kullanın. - Log on as a batch job hakkı: “Run whether user is logged on or not” seçiliyse, görev hesabının bu hakka sahip olması gerekir. Bu hak grup ilkesiyle kaldırılmışsa görev başlamaz.
- Görev geçmişi: Task Scheduler konsolunda sağ taraftaki Enable All Tasks History seçeneğini açarak görevin her adımını History sekmesinden izleyebilirsiniz.
Script içine Start-Transcript -Path "C:\script\log.txt" satırını eklemek de, görev arka planda çalışırken ekrana basılan tüm çıktıyı ve hataları bir dosyaya yazdırarak sorunu bulmanızı kolaylaştırır.
Bu makalemizde PowerShell script dosyalarının Microsoft Windows Task Scheduler üzerinde nasıl zamanlanacağını, aynı işin PowerShell ile nasıl yapılacağını ve sık karşılaşılan sorunların çözümünü göstermiş olduk. Umarım faydalı bir makale olmuştur. Bir sonraki makalemizde görüşmek dileğiyle.
