Bit Eşlem Resmini PowerShell Betiği İle Kaldırın[Kalıcı]

Programlama ve Script dilleri konusunda bilgi paylaşım alanıdır.
Cevapla
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15651
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2734 kez
Teşekkür edildi: 5656 kez

Bit Eşlem Resmini PowerShell Betiği İle Kaldırın[Kalıcı]

Mesaj gönderen TRWE_2012 »

Merhabalar

Sordum.NET Makale Adı : Sağ tuş yeni menüsündeki Bit eşlem resmini kaldırın
Sordum.NET Makalesinin Web Adresi : https://www.sordum.net/81020/sag-tus-ye ... -kaldirin/

Ben, burada anlatılanları manuel yapıyordum ama 15 günde bir yada "Kullanıcı Hesap Değişikliğinde" geri geliyordu bu sinir olduğum gıcık alt menü girdisi ki , WindowsXP'den beridir birkez olsun kullanmadım bunu...

Sonra dedim ki, yeter artık...!!! bıktım senden ve geri gelmelden....

Bu amaçla bir .ps1 betiği kodladım kendime çünkü bıkmıştım bundan..., bana kalıcı bir çözüm lazımdı...

İşte yaradı...

Önce betiğin içeriğini verelim , sonra konu anlatımını ve en son'da ekran görüntüsünü verelim...

Remove-BitmapFromNewMenu.ps1

Kod: Tümünü seç

<#
.SYNOPSIS
    Removes/clears the "New > Bitmap image" display string from the Windows 11
    right-click New menu (Turkish UI: "Bit eslem resmi"), which is regenerated
    by the Microsoft Paint MSIX package via the MrtCache resource cache.

.DESCRIPTION
    Manual removal via Regedit works (search HKCR\Local Settings\MrtCache for
    a string value equal to the localized "Bitmap image" label and blank it
    out), but the Paint app re-populates this cache whenever Microsoft Store
    updates the package (roughly every 10-20 days). This script automates the
    search-and-clear operation, backs up the affected registry branch first,
    logs every change, and can optionally schedule itself to run automatically
    every 2 weeks so the fix keeps reapplying without manual intervention.

.PARAMETER Force
    Skip the confirmation prompt before clearing matched values.

.PARAMETER Silent
    Skip the "restart Explorer now" prompt and restart it automatically.
    Intended for unattended runs (e.g. from Task Scheduler).

.PARAMETER Schedule
    Register a Scheduled Task that re-runs this script every 2 weeks with
    -Force -Silent, so the fix reapplies itself automatically over time.

.PARAMETER Unschedule
    Remove the Scheduled Task created by -Schedule.

.NOTES
    Target key : HKCU:\Software\Classes\Local Settings\MrtCache
    Scope      : Current user only, no administrator rights required.
    Effect     : Explorer restart is required to see the New menu change.

.EXAMPLE
    .\Remove-BitmapFromNewMenu.ps1
    Interactive run: scans, shows matches, asks before clearing and before
    restarting Explorer.

.EXAMPLE
    .\Remove-BitmapFromNewMenu.ps1 -Force -Silent -Schedule
    Clears matches immediately, restarts Explorer automatically, and installs
    a recurring scheduled task so this keeps happening every 2 weeks.
#>

[CmdletBinding()]
param(
    [switch]$Force,
    [switch]$Silent,
    [switch]$Schedule,
    [switch]$Unschedule
)

$ErrorActionPreference = "Stop"

$TaskName    = "RemoveBitmapFromNewMenu"
$ScriptPath  = $MyInvocation.MyCommand.Path
$LogDir      = Join-Path $env:USERPROFILE "Documents\BitmapNewMenuFix"
$LogFile     = Join-Path $LogDir "removal-log.txt"
$BackupDir   = Join-Path $LogDir "backups"
$MrtCacheKey = "HKCU:\Software\Classes\Local Settings\MrtCache"

function Write-Log {
    param([string]$Message)
    $line = "[{0}] {1}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Message
    Write-Host $line
    Add-Content -Path $LogFile -Value $line
}

function Initialize-Environment {
    if (-not (Test-Path $LogDir))    { New-Item -ItemType Directory -Path $LogDir -Force | Out-Null }
    if (-not (Test-Path $BackupDir)) { New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null }
}

function Backup-MrtCache {
    if (-not (Test-Path $MrtCacheKey)) {
        Write-Log "MrtCache key not found, nothing to back up."
        return $false
    }
    $stamp      = Get-Date -Format "yyyyMMdd_HHmmss"
    $backupFile = Join-Path $BackupDir "MrtCache_$stamp.reg"
    $regPath    = "HKEY_CURRENT_USER\Software\Classes\Local Settings\MrtCache"
    reg.exe export $regPath $backupFile /y | Out-Null
    Write-Log "Backup created: $backupFile"
    return $true
}

function Find-BitmapEntries {
    $results = @()
    if (-not (Test-Path $MrtCacheKey)) { return $results }

    Get-ChildItem -Path $MrtCacheKey -Recurse -ErrorAction SilentlyContinue | ForEach-Object {
        $key = $_.PSPath
        if ($key -notlike "*Paint*") { return }

        $props = Get-ItemProperty -Path $key -ErrorAction SilentlyContinue
        if (-not $props) { return }

        $props.PSObject.Properties |
            Where-Object { $_.Name -notmatch "^PS(Path|ParentPath|ChildName|Drive|Provider)$" } |
            ForEach-Object {
                # "?" matches exactly one character, avoids hardcoding the
                # Turkish "s with cedilla" letter in the source file.
                if ($_.Value -is [string] -and $_.Value -like "Bit e?lem resmi") {
                    $results += [PSCustomObject]@{
                        KeyPath   = $key
                        ValueName = $_.Name
                        OldValue  = $_.Value
                    }
                }
            }
    }
    return $results
}

function Clear-BitmapEntries {
    param([array]$Entries)
    foreach ($entry in $Entries) {
        Set-ItemProperty -Path $entry.KeyPath -Name $entry.ValueName -Value ""
        Write-Log ("Cleared value '{0}' (was: '{1}') under {2}" -f $entry.ValueName, $entry.OldValue, $entry.KeyPath)
    }
}

function Restart-Explorer {
    Write-Log "Restarting Explorer to apply the change..."
    Stop-Process -Name explorer -Force
    Start-Sleep -Seconds 2
    Start-Process explorer.exe
}

function Register-FixTask {
    $action = "-NoProfile -ExecutionPolicy Bypass -File `"$ScriptPath`" -Force -Silent"
    schtasks.exe /Create /TN $TaskName /TR "powershell.exe $action" /SC WEEKLY /MO 2 /ST 09:00 /RL LIMITED /F | Out-Null
    Write-Log "Scheduled task '$TaskName' registered (runs every 2 weeks)."
}

function Unregister-FixTask {
    schtasks.exe /Delete /TN $TaskName /F | Out-Null
    Write-Log "Scheduled task '$TaskName' removed."
}

# --- Main ---
Initialize-Environment

if ($Unschedule) {
    Unregister-FixTask
    Read-Host "`nPress ENTER to exit."
    exit
}

if ($Schedule) {
    Register-FixTask
}

Write-Log "Scanning MrtCache for bitmap entries..."
# @() forces array context so a single match does not get unrolled into a
# scalar object, which would make $found.Count report blank/null.
$found = @(Find-BitmapEntries)

if ($found.Count -eq 0) {
    Write-Log "No matching entries found. Nothing to do."
} else {
    $suffix = "ies"
    if ($found.Count -eq 1) { $suffix = "y" }
    Write-Log ("Found {0} matching entr{1}:" -f $found.Count, $suffix)
    $found | ForEach-Object { Write-Log ("  - {0} => '{1}'" -f $_.KeyPath, $_.OldValue) }

    $proceed = $Force
    if (-not $proceed) {
        $answer  = Read-Host "Clear these values now? (Y/N)"
        $proceed = ($answer -eq "Y" -or $answer -eq "y")
    }

    if ($proceed) {
        Backup-MrtCache | Out-Null
        Clear-BitmapEntries -Entries $found

        $restart = $Silent
        if (-not $restart) {
            $answer  = Read-Host "Restart Explorer now to apply the change? (Y/N)"
            $restart = ($answer -eq "Y" -or $answer -eq "y")
        }
        if ($restart) { Restart-Explorer }
    } else {
        Write-Log "Operation cancelled by user."
    }
}

Read-Host "`nPress ENTER to exit."
KONU ANLATIMI :
MrtCache Üzerinden Windows New Menü Kaydının Temizlenmesi
Resim
Ekran görüntümüz de artık "Yeni" alt menüsünde "Bit eşlem resmi" seçeneği görünmüyor , script'in yaptığı işlem, dosya ilişkilendirme (file association) katmanına dokunmadan, sadece görüntü katmanındaki bir metin kaynağını (resource string) boşaltarak bu sonucu elde etti. Bunun nasıl çalıştığını anlamak için Windows'un modern uygulama paketleme (MSIX/AppX) mimarisinin kaynak yönetimini bilmek gerekiyor.

Windows 11'de Paint artık klasik bir masaüstü uygulaması değil, bir MSIX paketi (Microsoft.Paint_11.2603.251.0_x64__8wekyb3d8bbwe).

Bu tür paketler, arayüz metinlerini doğrudan koda gömmek yerine ayrı bir kaynak dosyasında (.pri = Package Resource Index) tutar ve koda sadece bir referans yazar: ms-resource://Microsoft.Paint/Resources/ShellNewDisplayName_Bmp. Log çıktısında tam olarak bu referansı görülür.

Windows Kabuğu (Explorer), "Yeni" menüsünü her açtığında bu tür ms-resource:// referanslarını okunabilir metne çevirmek zorunda. Bu çeviriyi her seferinde .pri dosyasından yapmak performans açısından maliyetli olduğundan, sistem çözümlenen değeri MrtCache (Multilingual Resource Technology Cache) adı verilen bir registry önbelleğinde saklar , tam olarak script'in temizlediği konum:

Kod: Tümünü seç

HKCU\Software\Classes\Local Settings\MrtCache\...\MergedResources-0.pri\...
Burada anahtar hash'lenmiş klasör yapısı (1dceb821ca1db8a\4fa3d702) doğrudan .pri dosyasının içeriğine göre üretiliyor, değer verisi ise çözümlenmiş sonuç: "Bit eşlem resmi". Explorer, menüyü çizerken referansı tekrar .pri'den okumak yerine bu önbellekten okuyor.

Script'in yaptığı işlem şuydu/şudur : değeri silmek yerine boşaltmak. Çünkü:

1.Anahtarı/değeri tamamen silerseniz, Explorer önbellekte bulamayınca .pri dosyasından tekrar okuyup önbelleği yeniden dolduruyor (bu yüzden manuel silme denemeleri genelde anında geri geliyordu).

2.Değeri boş string'e çevirdiğinizde ise önbellek hâlâ mevcut (cache miss değil, cache hit) ama gösterecek bir metin yok . Explorer boş etiketli bir menü öğesi oluşturmak yerine o öğeyi menüden tamamen düşürüyor.

Benim şikayet durum da önceki "15 günde bir geri gelme" sorunu da bununla açıklanıyor:

Microsoft Store, Paint paketini güncellediğinde (11.2311.30.0 ====>>> 11.2603.251.0 sürüm artışını log'unuzda görebilirsiniz) yeni bir .pri dosyası gelir, sistem önbelleği o paket için yeniden oluşturur ve boşalttığınız değer tazelenir. -Schedule parametresiyle kurduğumuz görev zamanlayıcı görevi, bu yeniden oluşumu? sorusunu, her 2 haftada bir otomatik olarak tekrar temizleyecek şeklinde garanti altına alır.

Özetle, sildiğimiz şey Paint uygulamasının kendisi ya da BMP dosya ilişkilendirmesi değil, sadece Explorer'ın "Yeni" menüsünü çizerken(oluştururken) kullandığı önbelleğe alınmış bir arayüz etiketiydi. Paint programı normal şekilde çalışmaya devam eder, BMP dosyaları normal şekilde açılır , sadece sağ tık menüsündeki gereksiz kısayol kaybolmuştur. Aldığınız .reg yedeği sayesinde istediğiniz an eski haline dönebilirsiniz.Hem bizim adminin teknik makalesinin sağlaması/özet otomasyonunu yapmış oldum çünkü gerçekten bıkmıştım, aynı terane aynı terane...

NASIL KULLANILIR .PS1 İNTERAKTİF KULLANIM KOMUT YAPILARI :
# Etkileşimli mod: bulur, sorar, sizin onayınızla siler

Kod: Tümünü seç

.\Remove-BitmapFromNewMenu.ps1
# Tek seferlik sessiz temizlik (soru sormadan siler + Explorer'ı yeniden başlatır)

Kod: Tümünü seç

.\Remove-BitmapFromNewMenu.ps1 -Force -Silent
# Kalıcı çözüm: temizler + her 2 haftada bir kendini otomatik çalıştıracak
# bir Görev Zamanlayıcı görevi kaydeder (yönetici hakkı gerekmez)

Kod: Tümünü seç

.\Remove-BitmapFromNewMenu.ps1 -Force -Silent -Schedule
# Zamanlanmış görevi kaldırmak isterseniz

Kod: Tümünü seç

.\Remove-BitmapFromNewMenu.ps1 -Unschedule
ÖRNEK KOMUT ÇIKTISI :

Kod: Tümünü seç

PS C:\Users\TRWE_2012\Masaüstü> .\Remove-BitmapFromNewMenu.ps1
[2026-07-19 16:41:18] Scanning MrtCache for bitmap entries...
[2026-07-19 16:41:18] Found  matching entries:
[2026-07-19 16:41:18]   - Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Classes\Local Settings\MrtCache\C:%5CProgram Files%5CWindowsApps%5CMicrosoft.Paint_11.2603.251.0_x64__8wekyb3d8bbwe%5Cmicrosoft.system.package.metadata%5CS-1-5-21-530586688-2566659761-922542524-1000-MergedResources-0.pri\1dceb821ca1db8a\4fa3d702 => 'Bit eşlem resmi'
Clear these values now? (Y/N): Y
[2026-07-19 16:41:26] Backup created: C:\Users\TRWE_2012\Documents\BitmapNewMenuFix\backups\MrtCache_20260719_164126.reg
[2026-07-19 16:41:26] Cleared value '@{Microsoft.Paint_11.2603.251.0_x64__8wekyb3d8bbwe? ms-resource://Microsoft.Paint/Resources/ShellNewDisplayName_Bmp}' (was: 'Bit eşlem resmi') under Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Classes\Local Settings\MrtCache\C:%5CProgram Files%5CWindowsApps%5CMicrosoft.Paint_11.2603.251.0_x64__8wekyb3d8bbwe%5Cmicrosoft.system.package.metadata%5CS-1-5-21-530586688-2566659761-922542524-1000-MergedResources-0.pri\1dceb821ca1db8a\4fa3d702
Restart Explorer now to apply the change? (Y/N): Y
[2026-07-19 16:41:33] Restarting Explorer to apply the change...
Press ENTER to exit.:
PowerShell , Yönetici modunda başlatılmalıdır.

Script'i şu mantıkla tasarladım: (Yukarıdaki komutsal kullanım kalıplarına göre)

Teknik yaklaşım:

1.Hedef anahtar: HKCU:\Software\Classes\Local Settings\MrtCache (yönetici hakkı gerekmiyor, sadece mevcut kullanıcı kapsamında)

2.Türkçe karakter sorunu için ("Bit eşlem resmi" içindeki "ş" harfi) kodda literal Türkçe karakter kullanmak yerine -like "Bit e?lem resmi" joker karakter eşleştirmesi kullandım — ? tek karakteri temsil ediyor, böylece hem kural gereği kodda Türkçe karakter olmuyor hem de kodlama (encoding) sorunları tamamen bypass ediliyor

3.İşlem öncesi otomatik .reg yedeği alınıyor

4.Her değişiklik log dosyasına yazılıyor

4.-Schedule parametresiyle Görev Zamanlayıcı'ya her 2 haftada bir otomatik çalışacak bir görev kaydedebiliyor , böylece sizler elle uğraşmadan sorun tekrar oluştuğunda kendi kendini düzeltiyor.(siz hissetmiyorsunuz bile)

Notlar:

1.Sadece HKCU (mevcut kullanıcı) altında işlem yapıyor, yönetici hakkı gerektirmiyor ve sistem geneli bir şey değiştirmiyor.
Her çalıştırmada değişiklik öncesi %USERPROFILE%\Documents\BitmapNewMenuFix\backups\ altına .reg yedeği alıyor, tüm işlemleri removal-log.txt'ye kaydediyor .
Resim
2.Değişikliğin görünmesi için Explorer'ın yeniden başlatılması gerekiyor (script bunu soruyor veya -Silent ile otomatik yapıyor); bu işlem açık masaüstü pencerelerini etkilemez, sadece görev çubuğu/gezgin kısa süreliğine yanıp söner.

3.-Schedule seçeneği tam benim şikayet ettiğim "15 günde bir geri geliyor" sorununu kalıcı olarak çözmeyi hedefliyor , Paint güncellendiğinde önbellek yeniden dolsa bile en fazla 2 hafta içinde script otomatik temizliyor.

Güle güle kullanın ve @Tarkan_Dost'a da makalesinden ötürü özel teşekkürler...İyi ki varsın usta...(@Windows Hekimi)
Kullanıcı avatarı
burak35
Zettabyte4
Zettabyte4
Mesajlar: 18182
Kayıt: 07 Eki 2016, 13:06
cinsiyet: Erkek
Teşekkür etti: 10586 kez
Teşekkür edildi: 12350 kez

Re: Bit Eşlem Resmini PowerShell Betiği İle Kaldırın[Kalıcı]

Mesaj gönderen burak35 »

shellnewsettings ile kaldırıp geçiyorum.
https://archive.org/details/shellNewSettings_v1.1
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15651
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2734 kez
Teşekkür edildi: 5656 kez

Re: Bit Eşlem Resmini PowerShell Betiği İle Kaldırın[Kalıcı]

Mesaj gönderen TRWE_2012 »

burak35 yazdı: 20 Tem 2026, 14:04 shellnewsettings ile kaldırıp geçiyorum.
https://archive.org/details/shellNewSettings_v1.1
Ben, o dediğin yazılımı denedim ama yazılım eski Windows'lara göre...Yani bende çalışmadı...
Kullanıcı avatarı
burak35
Zettabyte4
Zettabyte4
Mesajlar: 18182
Kayıt: 07 Eki 2016, 13:06
cinsiyet: Erkek
Teşekkür etti: 10586 kez
Teşekkür edildi: 12350 kez

Re: Bit Eşlem Resmini PowerShell Betiği İle Kaldırın[Kalıcı]

Mesaj gönderen burak35 »

çöpdows 11 hintli sistemi olduğu içindir :)
Cevapla

“Programlama ve Script dilleri” sayfasına dön