Şöyle bir ihtiyacım var; sunucularımdan birinin bu gece yarısından sonra saat 03:00'te tekrar başlamasını istiyorum. Bunu zamanlanmış görevlerle yapabilirim. Ama powershell ile yapmak istiyorum. Açık bir powershell penceresi bırakarak şu komutları yazarsam bu mümkün:
PS> Start-Sleep -Seconds (New-Timespan -End '2099-12-29 03:00').TotalSeconds; Restart-Computer
Burada Start-Sleep cmdlet'i belli bir süre beklemeyi sağlayacak. Ne kadar bekleyeceğini New-Timespan cmdlet'i ona söyleyecek. New-Timespan cmdlet'i şu andan itibaren 29.12.2017 saat 03:00'e kadar ne kadar zaman beklemesi gerektiğini hesaplayacak. TotalSeconds ile de bu süreyi saniye cinsinden Start-Sleep cmdlet'ine verecek [1]. Bu kadar süre beklendikten sonra da Restart-Computer cmdlet'i ile sistemin tekrar başlaması sağlanacak.
Ancak bu komut dizisi, kopyala ve yapıştır amaçları için biraz tehlikeli. Yukarıdaki komutu kopyalayıp doğrudan powershell penceresine yapıştırıp orada tarih ve saati düzenleyeyim dersek doğrudan işletebilir. Daha önce orada yıl olarak 2099 yerine 2017 yazdığı ve o tarih de geçmişte kaldığı için makineyi doğrudan yeniden başlatmaya geçiyordu. Bunun için oraya yıl olarak uzak bir tarih girdim. Bir metin düzenleyicide (ör. Notepad) tarihi değiştirmeyi seçebilir, ya da kabaca kaç saat ve dakika sonra başlatılacağını hesaplayarak Start-Sleep cmdlet'ine bir elle hesaplanmış saniye miktarı verebiliriz. Örneğin 3 saat 45 dakika sonra komut çalıştırmak için
PS> Start-Sleep -Seconds ((3*60+45)*60); Restart-Computer
2024-07-04 ek: Hatta belki de bir zamanlanmış işler (Scheduled Jobs) nesnesi kullanabiliriz. Örneğin bugün 22:30'da çalışacak bir işlem için
PS> $baslat = New-JobTrigger -Once -At 22:30
PS> Register-ScheduledJob -Trigger $baslat -Name "Restart" -ScriptBlock {Restart-Computer -Force}
-Force parametresi olmadan olmadı.
2024-11-20 ek: Konu sadece kapatma veya yeniden başlatma ise, bunu powershell kullanmadan komut satırı programı shutdown.exe ile de yapabiliriz. Örneğin yeniden başlatmak için
PS> shutdown /r /t 3600
Burada 3600, saniye cinsinden gecikme miktarı. Powershell komut satırını kullanıyorsak buraya gecikmeyi hesaplayacak bir ifadeyi parantez içinde girebiliriz. Örneğin 1 saat 15 dk sonra yeniden başlatmak için
PS> shutdown /r /t (75*60)
Yeniden başlatma yerine bir kapatma işlemi yapmayı planlıyorsak, /r anahtarını /s ile değiştirmek gerek:
PS> shutdown /s /t 3600
Shutdown komutuyla verilen bir yeniden başlatma veya kapatma işlemini durdurmak için /a anahtarı (abort) kullanılabilir.
PS> shutdown /a
---
[1] http://www.madwithpowershell.com/2013/08/sleep-until-certain-time-with-powershell.html