8.04.2026

Bluetooth kulaklığın batarya seviyesi

Android'de olduğu gibi bluetooth kulaklığın batarya seviyesini görebilsek güzel olurdu. GNOME arayüzünde yok, bilemiyorum KDE veya diğer grafik arayüzlerde var mıdır. Ama terminalde görmek için önce

bluetoothctl

ile etkileşimli ortama girmek lazım. Sonra bu etkileşimi ortamda

devices

diyerek bağlı cihazları listelemek gerek. Burada istediğimiz cihazın MAC adresine benzeyen xx:xx:xx:xx:xx:xx formatındaki cihaz kimliğini kopyaladıktan sonra

info xx:xx:xx:xx:xx:xx

ile ayrıntılarını sorgulamak lazım. Burada en altta (hep böyle midir?)

Battery percentage: 0x47 (70)

gibi bir noktada batarya seviyemiz görülebilir. İlk yazan, tahmin edilebileceği gibi onaltılık sistemde 70'in karşılığı. Alışık olduğumuz onluk sistemde yüzde değerimiz 70.

4.04.2026

Linux terminalde basit matematik işlemleri

Powershell'de her türlü matematiksel işlem yapılırken bash veya diğer shell'lerde 4 işlem bile mümkün değil. Ama çözümü var: bc

bc yazıp giriş yaptığımızda etkileşimli bir ortam karşılıyor bizi. Çıkmak için quit yazmak gerek, exit işe yaramıyor. ctrl+c de işe yarar. Buraya girmeden basit bir şekilde sonucu öğrenmek için

echo '33*47' | bc

yazılabilir.

Trigonometrik fonksiyonlar gibi karışık işler için python kullanılabilir. Ama varsayılan shell'de math kütüphanesi gelmediği için önce import math ile kütüphaneyi eklemek gerek:

import math
math.sin(math.pi/2)

 

1.04.2026

HTML ayrıştırma

Invoke-WebRequest cmdlet'i ile HTML içinde istenen öğelerin hızlı ayrıştırması yapılabilir. Örneğin şu sayfada yapılmış bir örnekte github üzerindeki görsellerin indirilmesi için powershell kullanılmış. Hedef sayfamız 

$url = "https://github.com/PrateekKumarSingh/CheatSheets/tree/master/Powershell"

 ile belirtilmiş. Bu sayfanın içeriği Invoke-WebRequest ile $page değişkenine atanmış.

$page = Invoke-WebRequest -UseBasicParsing -Uri $url

Bu aşamadan sonra sayfadaki bütün bağlantılara $page.Links ile ulaşmak mümkün. Hatta bir miktar biçimlendirme ile

$page.Links | Where-Object title | Select-Object -Property title, href

gibi bir tablo oluşturulmuş. Daha önce duvar kağıdı indirme için şu örneği yapmıştım, yine Links kullanarak.

Daha karışık bir örnek için live.sysinternals.com/files sayfasında yer alan araçların bir listesini oluşturmak istediğimizi düşünelim. Yine $page.Links ile sayfadaki bağlantılara erişmek mümkün ama bir de sayfada yer alan ama bir şekilde Links veya diğer property'ler ile görüntülenemeyen araçların güncellenme tarihi almak istediğimizi varsayalım. Bunun için sayfanın ham (raw) HTML kaynağını bir HTMLFile nesnesine atarak içinde adım adım ilerlememiz gerek.

İlk iş bir HTMLFile nesnesi oluşturmak

    $htmObj = New-Object -ComObject "HTMLFile"

Daha sonra $page.Content verisini bu nesnenin içine alalım.

    $htmObj.IHTMLDocument2_write($list.Content)

Yukarıdaki satır bazı durumlarda (Office yüklü olmayan bilgisayarlar veya Powershell 6+ sürümlerde)

method invocation failed because [system.__comobject] does not contain a method named 'IHTMLDocument2_write'

hatası verebilir. Bu durumda IHTMLDocument2_write satırını aşağıdaki 2 satır ile değiştirmek gerekebilir.

    $bytes = [System.Text.Encoding]::Unicode.GetBytes($page.content)
    $htmObj.write($bytes)

try/catch bloğu ile iki yöntemin birleşimini sayfanın altına yazıyorum, burası daha fazla karışmasın. 

Sayfadaki tarih ve saat verisi 

     Saturday, March 21, 2026 11:18 AM

şeklinde olduğu için bu yapıyla eşleşebilecek bir regex oluşturalım.

$pattern = '(\w+,\s+\w+\s+\d+,\s+\d+\s+\d+:\d+\s+[AP]M)\s+(\d+)\s+(\S+)'

Sayfanın kaynak kodunda yer alan header bilgisi gibi işimizi yaramayacak verilerden kurtulmak için ilk tarih saat bilgisinin geçtiği konumu bulalım.

$indxStart = ($htmObj.body.outerText | sls -Pattern $pattern).Matches[0].Index

İlk kez tarih ve saat formatının geçtiği yer baz alacağımız başlangıç noktası olacak. Buradan sayfanın sonuna kadar olan yer ile ilgileniyoruz.

    $indxEnd = ($htmObj.body.outerText).Length
    $raw = $htmObj.body.outerText.Substring($indxStart, $indxEnd-$indxStart)

Sıra bu kalıba uyan verileri ayrıştırma adımına geldi. $pattern değişkeninin içinde 3 gruplandırma kullandım, parantezler içinde. Aşağıdaki Groups bölümleri (nesneleri, dizileri, neyse) buna göre oluşturuldu.

$results = [regex]::Matches($raw, $pattern) | ForEach-Object {
    [PSCustomObject]@{
        Date     = $_.Groups[1].Value.Trim()
        Size     = [int]$_.Groups[2].Value
        FileName = $_.Groups[3].Value
    }
}

live.sysinternals.com/files sayfasında bir değişiklik olana kadar bunun çalışacağını umuyorum.

    $results | Out-GridView

Sayfada Date, Size veya FileName alanlarına ait bir veri etiketi/başlık/alan adı bulunmuyor. Bunu en son ayrıştırma aşamasında yaptım. Bu bölümdeki her alan için $pattern değişkeni içindeki bölümlerle eşleşme şöyle:

DateGroups[1](\w+,\s+\w+\s+\d+,\s+\d+\s+\d+:\d+\s+[AP]M)
SizeGroups[2](\d+)
FileNameGroups[3]   
(\S+)

---

$htmObj = New-Object -ComObject "HTMLFile"
$page = iwr -useb "live.sysinternals.com/files"

try {
    # Bu yöntem genellikle MS Office yüklü sistemlerde ve Windows PowerShell'de çalışır
    $html.IHTMLDocument2_write($content)
}
catch {
    # Office yüklü değilse veya PowerShell Core kullanıyorsanız bu yöntem çalışır
    $bytes = [System.Text.Encoding]::Unicode.GetBytes($page.Content)
    $htmObj.write($bytes)
}

 

26.03.2026

Powershell'in sayıları

Powershell, .Net altyapısı üzerine kurulu olduğu için onun veri tiplerini kullanıyor. Herhangi bir veri tipini kullanarak bir değişkende depolanabilecek en küçük ve en büyük sayıyı bulmak için ::MinValue ve ::MaxValue eklemek yeterli. Örneğin 32 bitlik bir tam sayının en küçük ve en büyük değerlerini bulmak için

> [int]::MinValue
-2147483648

> [int]::MaxValue
2147483647

İşaretsiz bir tam sayı için

> [uint32]::MinValue
0

> [uint]::MaxValue
4294967295

İşaretsiz tam sayıların en küçük değerini sorgulamak gereksiz olduğu için 64 bitlik bir işaretsiz tam sayının en büyük değerini sorgulayalım.

> [uint64]::MaxValue 
18446744073709551615

Benzer bir şekilde float ve double için de en küçük ve büyük değerler

> [float]::MaxValue 
> [double]::MaxValue

float ve double veri tiplerinin hassasiyetleri için ::Epsilon kullanılabilir. Bu veri tipleri işaretli (signed) olduğu için en küçük değerin mutlak değeri ile en büyük değer arasında çok küçük farklar var. Ama mutlak değeri en küçük (yani sıfıra en yakın, bir bütünün en küçük parçası) sayıyı bulmaktan bahsediyorum.

> [float]::Epsilon
1,401298E-45

> [double]::Epsilon
4,94065645841247E-324

long denen veri tipi aslında işaretli bir int64, 

7.03.2026

powershell muhtelif-3

Bir betiğin içinden mevcut klasörün yolunu tutan değişken

$PSScriptRoot

betiğin tam yolunu tutan değişken ise

$MyInvocation.MyCommand.Definition

Betiğin içinde çalıştığı powershell sürecinin kimlikğini görmek için (uzak oturumlarda bu, wsmprovhost'un süreç numarasını verir)

$PID

Son komut hatasız çalıştı mı sorusuna cevap (sorunun cevabı evetse True olur): 

$? 

Çalışan powershell süreci hakkında daha fazla bilgi:

[System.Diagnostics.Process]::GetCurrentProcess()

Mevcut bilgisayarın adını almak için (herhangi biri)

hostname
$env:Computername
[System.Environment]::MachineName
[System.Net.Dns]::GetHostName().Name

Oturum açmış kullanıcı adını almak için (herhangi biri)

whoami
$env:Username
[System.Environment]::UserName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

 IP adresini göster (çünkü Get-NetIPAddress çok yavaş)

gcim win32_networkadapterconfiguration -filter "ipenabled = 'True'"

 

6.03.2026

Uzaktaki bilgisayar üzerinde bir kısayol oluşturmak

Uzak bilgisayar üzerinde bir hedef dosyam var, D:\klasor\dosya.txt adında. Kullanıcı masaüstünde bu dosyaya bir kısayol oluşturmak istiyorum. Kullanıcı masaüstü de en genel haliyle C:\Users\kullanici\Desktop gibi bir yerde.

$hedefdosya = "D:\klasor\dosya.txt"
$kisayolkonumu = "C:\Users\kullanici\Desktop\dosya.lnk"

Kısayolu oluşturmak için WScript.Shell nesnesi oluşturacağım.

$WS1 = New-Object -ComObject WScript.Shell
$kisayol = $WS1.CreateShortcut($kisayolkonumu)
$kisayol.TargetPath = $hedefdosya
$kisayol.Save() 

---

https://powershellfaqs.com/create-a-shortcut-to-a-folder-using-powershell/ 

5.03.2026

Uzak bilgisayardaki nonpaged pool bellek miktarına ulaşmak

Uzak bir bilgisayardaki  "disk belleği olmayan havuz" değerine ulaşmak istedim. Bunun için iki seçenek var. Performans sayaçları (performance counters) ve WMI (ya da yeni adıyla CIM) sorguları.

Performans sayaçları konusu biraz karışık. Dile göre farklılık gösterebiliyor. Örnek olarak uzak bilgisayar İngilizce yerelleştirmeye sahipse bu sayaç değerini okumak için.

(Get-Counter -Computername uzakpc "\Memory\Pool Nonpaged Bytes").CounterSamples.CookedValue

yeterli olurken, Türkçe bir bilgisayarda 

(Get-Counter -Computername uzakpc "\Bellek\disk belleği olmayan havuz bayt sayısı").CounterSamples.CookedValue

çalışmadı. Onun yerine terminalden

Invoke-Command -Computername uzakpc {Get-Counter "\Bellek\disk belleği olmayan havuz bayt sayısı").CounterSamples.CookedValue}

ile sonuca ulaştım. Ancak bu satırı kopyalayıp bir metin dosyasına kaydedip ps1 uzantılı bir betik dosyası oluşturduğumda aldığım hata

Internal performance counter API call failed. Error: c0000bb9.
    + CategoryInfo          : InvalidResult: (:) [Get-Counter], Exception
    + FullyQualifiedErrorId : CounterApiError,Microsoft.PowerShell.Commands.GetCounterCommand
    + PSComputerName        : uzakpc 

oldu. Bir sorun var. O da dosyayı UTF-8 olarak kaydetmek. Kodlamayı ANSI olarak değiştirince sorun çözüldü. Şu sayfada powershell'in ps1 dosyalarında UTF-8 kodlamasını da kabul ettiği, sorunun sadece bazı karakterlerin kopyala yapıştır sırasında yanlış yerleştirildiğinden bahsedilmiş. Bu konu henüz incelenmedi.

İkinci yöntem olarak CIM sorgusu ile de ilerleyebilirdim.

(Get-CIMInstance -Computername uzakpc Win32_PerfFormattedData_PerfOS_Memory).PoolNonpagedBytes

Ama ilginç bir şekilde ilk kullanımda bu değeri dönmesi uzun sürüyor (+1 dakika).