18.08.2023

Powershell yürütme işleci

Execute operator'ün Türkçesi. Şu sayfadan basit bir örnek:

PS> $mysb = {$b = 456 ; Echo $b }

PS> & $mysb

456

Benden bir örnek:

PS> $myip = {(iwr "http://whatismyip.akamai.com").Content}

PS> $myip

Yine ss64.com'dan bir örnek daha; Script Block'un içinde param koyarak bir fonksiyon gibi kullanabiliriz:

PS> $alert = { param ($message) "$message" } 

PS> & $alert -message "Merhaba"

Merhaba


17.08.2023

Powershell veri biçimlendirme

Türkçe yerel ayarları olan bir bilgisayarda Powershell kullanırken ondalık sayıları yazarken ondalık ayraç nokta "." ama ekrana bastırırken virgüldür ","

$veri = 1222333.456789 # ondalık sayı

"{0:f}"  -f $veri # 1222333,57
"{0:f3}" -f $veri # 1222333,568
"{0:e}"  -f $veri # 1,222334e+006
"{0:E}"  -f $veri # 1,222334E+006
"{0:n}"  -f $veri # 1.222.333,57

$veri = 1299.99 # para birimi

"{0:c}" -f $veri # ₺1.299,99

$veri = 1234 # tamsayı

"{0:n}"    -f $veri # 1.234,00
"{0:d8}"   -f $veri # 00001234 (sola sıfır ekler)
"{0,8:n0}" -f $veri # ___1.234 (sayıdan önce 3 boşluk olur)

$veri = 255 # 16'lık düzen

"{0:x}"  -f $veri # ff
"{0:X4}" -f $veri # 00FF

#veri = 0.25 # yüzde

"{0:p}"  -f $veri # %25,00
"{0:p1}" -f $veri # %25,0
"{0:p0}" -f $veri # %25

# veri = Get-Date # tarih

"{0:d}"  -f $veri # 17.08.2023
"{0:D}"  -f $veri # 17 Ağustos 2023 Perşembe
"{0:f}"  -f $veri # 17 Ağustos 2023 Perşembe 15:17
"{0:F}"  -f $veri # 17 Ağustos 2023 Perşembe 15:17:41
"{0:g}"  -f $veri # 17.08.2023 15:17
"{0:g}"  -f $veri #
17.08.2023 15:17:42
"{0:r}"  -f $veri # Thu, 17 Aug 2023 15:17:41 GMT
"{0:o}"  -f $veri # 2023-08-17T15:17:41.0556971+03:00
"{0:yy-MM-dd}"  -f $veri # 23-08-17

Burada

d: kısa tarih
D: uzun tarih
f: uzun tarih, kısa saat
F: uzun tarih, uzun saat
t: kısa saat
T: uzun saat
g: kısa genel tarih biçimi
G: uzun genel tarih biçimi
yy: yılın son 2 hanesi (23 gibi)
yyyy: tam yıl biçimi (2023 gibi)
M: İçinde bulunulan ay, mümkünse tek haneli sayı
MM: İçinde bulunulan ay, çift haneli (tek ise önüne sıfır ekler)
MMM: İçinde bulunulan ay, 3 karakterli kısaltma
MMMM: İçinde bulunulan ay, tam adı
d : Ayın günü, tek haneli
dd: Ayın günü, çift haneli
hh: Saat, 12 saatlik düzende
HH: Saat, 24 saatlik düzende
mm: Dakika
ss: Saniye 

Select-Object ile hesaplanmış bir alan oluşturuken bu işi kısaca formatstring ile de yapabiliriz:

PS> Get-Process | Select-Object Name, Id, @{N="VM";E={$_.VM/1MB};formatstring="N2"}

Tarih için ayrıca Get-Date ile -Format parametresi de benzer iş görür.

PS> Get-Date -Format "yyyy-MM-dd HH:mm:ss"

2023-08-17 15:17:41

Get-Date'in bir de -UFormat parametresi var:

Get-Date -UFormat %V # yılın haftasını verir (1-52)

10'luk düzende bir sayıyı 16'lık düzende görmek için yukarıdaki gibi

PS> "{0:x}" -f 252   # fc

kullanılabilir. Ama daha genel olarak bir sayıyı herhangi bir düzende yazmak için

PS> [Convert]::ToString(252,2)
11111100

kullanılabilir.

16'lık düzendeki bir sayıyı girmek için başına 0x koymak yeterli:

0xfc    # onluk düzende 252'ye karşılık gelir

Veya ikilik düzendeki bir sayıyı girmek için başına 0b koymak gerek:

0b11111100    # bu da 252

Veya şu şekilde dönüştürmek de işimize yarayabilir:

[Convert]::ToInt32("11111100",2)
252

Burada kullanılan ikinci parametre olarak 2, sayının tabanını belirtiyor. 110 gibi bir sayı ikilik tabanda da olabilir, başka bir tabanda da. Verilen sayı onaltılık tabandaysa benzer bir şekilde (başına 0x ekleyerek veya eklemeden)

[Convert]::ToInt32("40",16)
64

hatta bu değerin karakter karşılığı için

[char][Convert]::ToInt32("11111100",2)
@


kullanılabilir. Bir dosyanın içeriğini hex olarak görmek için


PS> $icerik = cat '.\file.txt' -Encoding Byte -Raw
PS> [System.BitConverter]::ToString($icerik).Replace("-","") 

Daha kolay bir yol, belki, Format-Hex kullanmak:

PS> Format-Hex -Path '.\file.txt'

Tek satırda/cümlede birden fazla veri biçimlendirme:

PS> $veri1=1199; $veri2=5231; $veri3=3199.99
PS> "ilk sayımız {0:d8}, sonraki {1:e2} ve nihayet {2:f4}" -f $veri1, $veri2, $veri3
ilk sayımız 00001199, sonrajş 5,23e+003, ve nihayet 3199,9900

Şu sayfadan güzel birkaç örnek:

PS> "|{0,-10}| |{1,10}|" -f "hello", "world"
|hello     ||     world|

PS> "{0:###-##-##}" -f 1234567
123-45-67

Sonuna 3 haneli tamsayılar eklenmiş Name001, Name002,... gibi 100 isim üretmek:

PS> 1..100 | % { 'Name{0:d3}' -f $_ }

Bir karakterin 16'lık düzendeki karşılığı

PS> '0x' + "{0:x}" -f [int][char]'A'
0x41



3.08.2023

Windows'da dosya ve klasörlerin son değiştirme zamanlarını değiştirmek

NTFS dosya sistemi her dosya ve klasör için 3 farklı zaman bilgisi saklar; oluşturma, son değiştirme ve erişim.

PS> dir file1.txt | select Name, CreationTime, LastWriteTime, LastAccessTime

Name      CreationTime        LastWriteTime       LastAccessTime
----      ------------        -------------       --------------
file1.txt 2023-07-31 08:01:00 2023-08-01 14:05:00 2023-08-03 11:55:48

Bu tarihlerden herhangi birini değiştirmek için şöyle bir kullanım yeterli:

PS> (dir file1.txt).CreationTime=("1999-12-31 23:59:00")
PS> (dir file1.txt).LastWriteTime=("1999-12-31 23:59:00")
PS> (dir file1.txt).LastAccessTime=("1999-12-31 23:59:00")

Hatta bir klasördeki tüm dosyaların zamanlarını değitirmek için

$files =  Get-ChildItem -force | Where-Object {! $_.PSIsContainer}
foreach($object in $files)
{
     $object.CreationTime=("10 November 2016 12:00:00")
}

önerilmiş.