Címke: PowerShell

  • Duplikációk keresése, avagy power shell script íratása AI-val

    Duplikációk keresése, avagy power shell script íratása AI-val

    Ma ilyen AI-s napom van. Egyre jobban tör be a mindennapi munkámba, és úgy tűnik, hogy a hétvégeimet is ez teszi ki. Miért? Kérdezheted joggal. Megmondom. Az IT-ban, de gyanítom a többi szakmában is jobb, ha értünk hozzá, és megtanuljuk rutinosan használni, mintsem lemaradjunk róla, és nézzük bambán, ahogy az élet felsuhan előttünk.

    Nézzük, mire is mentem elsőre.

    Az alábbi PowerShell-script végigpásztázza a megadott mappát (és annak almappáit), a fájlok SHA256 hash értéke alapján azonosítja a duplikációkat, majd az eredményt kiírja a képernyőre és elmenti egy CSV-fájlba.

    PowerShell duplikáció-kereső script

    Hozz létre egy find-duplicates.ps1 fájlt, és másold bele az alábbi kódot:

    PowerShell

    # --- BEÁLLÍTÁSOK ---
    $TargetFolder = "C:\Elérési\Út\A\Mappához"   # Cseréld ki a vizsgálandó mappa útvonalára
    $OutputFile   = "C:\Elérési\Út\duplikatumok.csv" # Ide menti az eredményt
    
    Write-Host "Fájlok indexelése és hash értékek számítása..." -ForegroundColor Cyan
    
    # 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
    $fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
        Group-Group-Object -Property Length |
        Where-Object { $_.Count -gt 1 }
    
    $duplicates = @()
    $totalGroups = $fileGroups.Count
    $counter = 0
    
    # 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
    foreach ($group in $fileGroups) {
        $counter++
        Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)
    
        $hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }
    
        foreach ($hashGroup in $hashTable) {
            foreach ($file in $hashGroup.Group) {
                $duplicates += [PSCustomObject]@{
                    Hash     = $hashGroup.Name
                    Path     = $file.Path
                    SizeMB   = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
                }
            }
        }
    }
    
    # 3. Eredmények megjelenítése és mentése
    if ($duplicates.Count -gt 0) {
        Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
        $duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path
    
        $duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
        Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
    } else {
        Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
    }
    

    Így használd:

    1. Nyisd meg a PowerShell-t (akár Rendszergazdaként, ha védett mappákat is vizsgálsz).
    2. Írd át a $TargetFolder változót a keresni kívánt mappára.
    3. Futtasd a scriptet:PowerShell.\find-duplicates.ps1

    Megjegyzés: Ha a PowerShell letiltja a scriptek futtatását, futtasd ezt a parancsot a munkamenetben:

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

    Majd második próbálkozásra

    Módosítottam a scriptet, hogy a célmappát (és opcióként a kimeneti CSV-fájl helyét is) paraméterként fogadja el.

    A módosított script kódja:

    PowerShell

    <#
    .SYNOPSIS
        Fájl duplikációkat kereső és gyűjtő PowerShell script.
    
    .DESCRIPTION
        A script végigpásztázza a paraméterként megadott mappát (és annak almappáit),
        és az SHA256 hash értékek alapján azonosítja a duplikátumokat.
        Az eredményt megjeleníti a konzolon és CSV-fájlba menti.
    
    .PARAMETER TargetFolder
        A vizsgálandó mappa útvonala (kötelező paraméter).
    
    .PARAMETER OutputFile
        A kimeneti CSV fájl útvonala (opcionális, alapértelmezett: .\duplikatumok.csv).
    #>
    
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Kérjük, adja meg a vizsgálandó mappa útvonalát!")]
        [ValidateScript({ Test-Path $_ -PathType Container })]
        [string]$TargetFolder,
    
        [Parameter(Mandatory = $false, Position = 1)]
        [string]$OutputFile = ".\duplikatumok.csv"
    )
    
    # Abszolút útvonalak feloldása
    $TargetFolder = (Resolve-Path $TargetFolder).Path
    $OutputFile   = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutputFile)
    
    Write-Host "Mappa elemzése: $TargetFolder" -ForegroundColor Cyan
    Write-Host "Fájlok indexelése és méret szerinti csoportosítása..." -ForegroundColor Cyan
    
    # 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
    $fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
        Group-Object -Property Length |
        Where-Object { $_.Count -gt 1 }
    
    $duplicates = @()
    $totalGroups = $fileGroups.Count
    $counter = 0
    
    if ($totalGroups -eq 0) {
        Write-Host "`nNem találhatók azonos méretű fájlok, nincsenek duplikátumok." -ForegroundColor Green
        exit
    }
    
    # 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
    foreach ($group in $fileGroups) {
        $counter++
        Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)
    
        $hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }
    
        foreach ($hashGroup in $hashTable) {
            foreach ($file in $hashGroup.Group) {
                $duplicates += [PSCustomObject]@{
                    Hash     = $hashGroup.Name
                    Path     = $file.Path
                    SizeMB   = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
                }
            }
        }
    }
    
    # 3. Eredmények megjelenítése és mentése
    if ($duplicates.Count -gt 0) {
        Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
        $duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path
    
        $duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
        Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
    } else {
        Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
    }
    

    Használati példák:

    1. Alapértelmezett használat (a mappa elérést megadva, az eredmény a beállítások szerint a duplikatumok.csv-be kerül):PowerShell.\find-duplicates.ps1 -TargetFolder "C:\Users\Public\Documents"
    2. Pozicionális paraméterként (nem kell kiírni a névadó kapcsolót):PowerShell.\find-duplicates.ps1 "D:\Képek"
    3. Egyedi CSV kimeneti fájlnév megadásával:PowerShell.\find-duplicates.ps1 -TargetFolder "D:\Dokumentumok" -OutputFile "C:\Riportok\doksi_duplikatumok.csv"

    Újdonságok a scriptben:

    • Automatikus mappa-ellenőrzés (ValidateScript): Ha nem létező vagy hibás mappa-útvonalat adsz meg, a script még a futás előtt jelez és leáll.
    • Mappa-kötelezőség (Mandatory = $true): Ha paraméter nélkül indítod el a scriptet, a PowerShell automatikusan megkérdezi tőled a célmappa útvonalát.

    Nem vagyok teljes mértékben elragadtatva az eredménytől, de mára ez bőven elég volt, majd folytatjuk…