mikedopp icon

DuplicateStuff

mikedopp | PRO | 08/11/17 09:11:34 AM UTC | 0 ⭐ | 318 👁️ | Never ⏰ | []
PowerShell |

3.1 KB

|

None

|

0 👍

/

0 👎

workflow Find-Dupes {
    [cmdletbinding()]
    param(
        [int]$ThrottleLimit = 3
    )
    
    #   Define script Variables
 
    [int]$IndexCount = '0'
    $Path = "F:\TEST\"
    $Log = ($Path + 'dupelog.txt')
    $DirectoryIndex = ($Path + 'TotalIndex.csv')
    $TotalCorrect = ($Path + 'TotalCorrect.csv')
    [int]$DupeCount = '0'
    [int]$FileCount = '0'
        
    Function Index-Folders
    {
        #   Test to see if $Path is a valid location and if not end the program.
        if (!(Test-Path -PathType Container $Path))
        {
            Write-Error "Invalid path specified."
            Exit
        }
 
        [string](get-date) + ' : Scanning Path .... ' + $Path | Add-Content -Path $Log
        Write-Host "Folder Scan Started" -ForegroundColor Yellow
        $Folders = Get-ChildItem -Directory -Path $Path -Recurse | Select FullName
        Write-Host "Folder Scan Complete" -ForegroundColor Yellow
        [string](get-date) + ' : ' + $Path + ' scanned successfully.' | Add-Content -Path $Log
        return $Folders
        
    }
 
    Function Index-Dupes ($Index)
    {
 
        [bool]$MasterFound = $false
        [bool]$DupeFound = $false
        $FilesList = Import-Csv -Path $Index
        $duplicates = $FilesList.HashVal | Group-Object | ?{ $_.Count -gt 1 }
    
        foreach ($dupe in $duplicates)
        {
            foreach ($file in $FilesList)
            {
                if (([string]$file.HashVal -eq [string]$dupe.Name) -and (!$MasterFound))
                {
                    $File.IsDuped = $True
                    $MasterFound = $true
                    $file.IsMaster = $true
                }
                elseif (([string]$file.HashVal -eq [string]$dupe.Name) -and ($MasterFound))
                {
                    $File.IsDuped = $True
                    $DupeFound = $true
                    $File.Action = 'Archive'
                    $WORKFLOW:DupeCount++
                }
            
            }
        
            $MasterFound = $false
        }
    
        $FilesList | Export-Csv -Path $TotalCorrect -NoTypeInformation -Append -Force
        Remove-Item -Path $FIndex -Force
 
    }
 
    $FoldersIndexed = Index-Folders
    Class Image
    {
        [string]$directory
        [string]$filename
        [bool]$IsDuped
        [bool]$IsArchived
        [string]$ArchivePath
        [string]$HashVal
        [bool]$IsMaster
        [string]$Action
    }
 
    foreach -parallel -throttlelimit $ThrottleLimit ($folder in $FoldersIndexed)
        {
            $files = gci -Path $folder.FullName -Filter *.dex
            $FIndex = ($Path + 'FolderIndex' + $IndexCount + '.csv')
            foreach ($file in $files)
            {
                $CurrentImage = [Image]::new()
                $CurrentImage.filename = $file.Name
                $CurrentImage.directory = $file.Directory
                $CurrentImage.HashVal = (Get-FileHash -Algorithm MD5 -Path $file.FullName).Hash
                $LogString = [string](get-date) + ' : ' + [string]($CurrentImage.Directory + '\' + $CurrentImage.filename) + ' has been indexed'
                Add-Content -Path $Log -Value $LogString
                $WORKFLOW:FileCount++
                $CurrentImage | Export-CSV -Path $FolderIndex -NoTypeInformation -Append
            }
        
            if ((get-content $FolderIndex -ErrorAction SilentlyContinue) -ne $NULL)
            {
                Index-Dupes -Index $FIndex
            }
            $WORKFLOW:IndexCount++
        }
 
    $percentageOfDupes = ($WORKFLOW:DupeCount / $WORKFLOW:FileCount) * 100
 
    Write-Host ("Dupes that can be removed account for " + $percentageOfDupes + '% of the total files.')
}

Comments