PowerShell TimeSpans'ı Biçimlendirme


Çoğu zaman bir şeyin nasıl yapılacağını çözerim ve bir ay sonra onu nasıl yapacağımı hatırlamakta zorlanırım. Hangi kod parçasını yazdığımı hatırlamaya çalışmak yerine neden onun hakkında yazmayasınız? Hatırlayabildiğimi varsayarsak! Neyse, işte bugünün “PSRemembery”si.

Ben sıklıkla buna benzer kod kullanıyorum ve çoğunuzun da aynısını yapmasını bekliyorum.

$os = Get-CimInstance win32_operatingsystem
$os | Select-Object CSName,LastBootUpTime,
@{Name="Uptime";Expression={(Get-Date) - $_.lastbootuptime}}

Bu zaman aralığı değerine sahip bir değişken oluşturacağım.

$up = (Get-Date) - $os.lastbootuptime

Gördüğünüz gibi timespan nesnesi, PowerShell'in sonucu benim için biçimlendirirken kullandığı bir ToString() yöntemine sahiptir.

Dizeyi ihtiyaçlarımı karşılayacak şekilde biçimlendirmek için bu yöntemi kullanabileceğim ortaya çıktı. Ama bu zor ve bu her zaman unuttuğum kısım. Büyük/küçük harfe duyarlı belirteçleri kullanabilirsiniz.

Bu, milisaniye değerinden kurtulur ancak deşifre edilmesi biraz zordur. Biçim dizesine başka metin parçaları ekleyebilirim ancak PowerShell'e bunları değişmez dizeler olarak değerlendirmesini söylemem gerekiyor.

$up.ToString("dd\.hh\:mm\:ss")

Zaman aralığının okunmasını kolaylaştırmak için noktalama işaretini ekliyorum.

Milisaniyeyi 2 ondalık basamağa dahil etmek istersem bunu da yapabilirim. Bunu bir adım daha ileri götürelim. Bazı kişilerin çıktının bir parçası olarak 'günler', 'saatler' ve 'dakikalar' (veya bazı varyasyonları) içeren dizeyi görmekten hoşlandıklarını biliyorum. Ben de bunu yapabilirim. İşte birkaç örnek.

$up.ToString("dd'dy:'hh'hr:'mm'min:'ss'sec'")
$up.ToString("dd' days 'hh' hours 'mm' minutes 'ss' seconds'")

Noktalama işaretlerinden kaçmak yerine metni, PowerShell'e onu özel bir karakter olarak değerlendirmemesini söyleyen tek tırnak içine alıyorum. Boşluklar tek tırnaklı değerlerin parçasıdır.

"{0:dd}d:{0:hh}h:{0:mm}m:{0:ss}s" -f $up

Operatörün sol tarafı yedek jetonları içerir. Sağ tarafta işlenen nesneler bulunur. 0, PowerShell'e sağ taraftaki ilk nesneyi kullanmasını söyler. Aynı büyük/küçük harfe duyarlı belirteçleri kullandığıma dikkat edin.

-f operatörü, bir dosyaya yazmak veya mesaj olarak görüntülemek isteyebileceğiniz dize mesajları oluşturmanın kullanışlı bir yoludur.

Ancak ilk ihtiyacıma dönersek, bu biçimlendirme bilgisiyle daha iyi biçimlendirilmiş çıktı elde etmek için bunun gibi komutları çalıştırabilirim.

$os | Select-Object CSName,LastBootUpTime,
@{Name="Uptime";Expression={((Get-Date) - $_.lastbootuptime).tostring("dd\.hh\:mm")}}

$os | Select-Object CSName,LastBootUpTime,
@{Name="Uptime";Expression={"{0:dd}d:{0:hh}h:{0:mm}m:{0:ss}s" -f ((Get-Date) - $_.lastbootuptime)}}

İlk örnekte saniye sayısının bile önemsiz olduğuna karar verdim ve onları bıraktım.

Son bir yorum ise Uptime özelliğim timespan olarak başlamış olsa da bu formatlamadan sonra özelliği string haline getirdim. LastBootUpTime özelliğini çıkardığım orijinal kodum hala bir zaman aralığı nesnesidir. PowerShell bunu yalnızca bir dize olarak görüntüler. Sort-Object veya Where-Object'e iletiyorsanız bu durum ifadenizi etkileyebilir. Get-Member'ın arkadaşınız olduğunu unutmayın.

Ve umarım bir dahaki sefere milisaniyeleri ortadan kaldırmak için bir zaman aralığını nasıl biçimlendirdiğimi hatırlamaya çalıştığımda bunu yazdığımı hatırlayabilirim. Her zaman olduğu gibi soru ve yorumlarınızı bekliyoruz.

İlgili makaleler