elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [APORTE] [PowerShell] RAR.exe | Multi-Compression Test Tool (Para Archivos)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [APORTE] [PowerShell] RAR.exe | Multi-Compression Test Tool (Para Archivos)  (Leído 953 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.822



Ver Perfil
[APORTE] [PowerShell] RAR.exe | Multi-Compression Test Tool (Para Archivos)
« en: 2 Marzo 2024, 13:01 pm »

El siguiente script desarrollado en PowerShell y dependiente del programa externo RAR.exe (WinRAR), sirve para comprimir cada archivo dentro del directorio actual de forma individual, con compresión máxima, y utilizando los tamaños de diccionario especificados.

La sección "Variables" dentro del script permite configurar varias cosas, entre ellas:

 - Los tamaños de diccionario.
 - Las extensiones de archivo que se deben procesar sin aplicar compresión.
 - Preservar solamente el archivo RAR generado con el menor tamaño de todos. (eliminar los archivos RAR de mayor tamaño)
 - Especificar una diferencia de tamaño (tolerancia) arbitraria para eliminar archivos RAR generados (con mayores tamaños de diccionario) de un tamaño de archivo similar.
 - Enviar los archivos RAR eliminados a la papelera de reciclaje.

Es muy útil, por ejemplo, para comprimir de forma automatizada archivos ISO de consolas, y obtener así el mejor resultado entre Tamaño de diccionario / Tamaño de archivo.









Código
  1. <#
  2. ===========================================================================================
  3. |                                                                                         |
  4. |                                        Variables                                        |
  5. |                                                                                         |
  6. ===========================================================================================
  7. #>
  8.  
  9. $rarExecutablePath = "C:\Program Files\WinRAR\rar.exe"
  10. $dictionarySizes   = @(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048)
  11. $toleranceSizeDiff = "1MB"
  12. $keepOnlySmallestRarFile  = $true
  13. $sendRarFilesToRecycleBin = $false
  14.  
  15. $compressedFileTypesArchive = @(
  16.    "7z" , "arc", "bz2" , "bzip", "bzip2",
  17.    "gz" , "gz2", "gza" , "gzi" , "gzip" ,
  18.    "lha", "lz" , "lz4" , "lzh" , "lzma" ,
  19.    "rar", "sfx", "tgz" , "tlz" , "tlzma",
  20.    "uha", "zip", "zipx", "zpaq"
  21. )
  22.  
  23. $compressedFileTypesAudio = @(
  24.    "aac", "ac3", "fla","flac",
  25.    "m4a", "mp3", "ogg", "ogm",
  26.    "usm", "wma"
  27. )
  28.  
  29. $compressedFileTypesVideo = @(
  30.    "asf", "avc", "avi" , "bik" , "bk2" , "f4v" , "flv" ,
  31.    "m1v", "m2t", "m2ts", "m2v" , "m4v" , "mpv4",
  32.    "mkv", "mov", "mp4" , "mpeg", "mpg" , "mts" ,
  33.    "qt" , "ts" , "vob" , "vp6" , "webm", "wmv"
  34. )
  35.  
  36. $compressedFileTypesOther = @(
  37.    "avif", "jpeg", "jpg" , "gif" , "pdf",
  38.    "pam" , "paq6", "paq7", "paq8",
  39.    "par" , "par2", "wad"
  40. )
  41.  
  42.  
  43. [string]$fileTypesToKeepUncompressed = (
  44.    $compressedFileTypesArchive +
  45.    $compressedFileTypesAudio +
  46.    $compressedFileTypesVideo +
  47.    $compressedFileTypesOther
  48. ) -join ';'
  49.  
  50. <#
  51. ===========================================================================================
  52. |                                                                                         |
  53. |                    rar.exe commands (only those used in this script)                    |
  54. |                                                                                         |
  55. ===========================================================================================
  56.  
  57. <Commands>
  58.  a             Add files to archive
  59.  
  60. <Switches>
  61.  -am[s,r]       Archive name and time [save, restore]
  62.  -c-            Disable comments show
  63.  -cfg-          Ignore configuration file and RAR environment variable.
  64.  -dh            Open shared files
  65.  -ep1           Exclude base directory from names
  66.  -ht[b|c]       Select hash type [BLAKE2,CRC32] for file checksum
  67.  -id[c,d,n,p,q] Display or disable messages
  68.  -ilog[name]    Log errors to file
  69.  -isnd[-]       Control notification sounds
  70.  -m<0..5>       Set compression level (0-store...3-default...5-maximal)
  71.  -ma[4|5]       Specify a version of archiving format
  72.  -md<n>[k,m,g]  Dictionary size in KB, MB or GB
  73.  -ms[list]      Specify file types to store.
  74.  -o[+|-]        Set the overwrite mode
  75.  -oc            Set NTFS Compressed attribute.
  76.  -oh            Save hard links as the link instead of the file
  77.  -oi[0-4][:min] Save identical files as references
  78.  -ol[a]         Process symbolic links as the link [absolute paths]
  79.  -oni           Allow potentially incompatible names
  80.  -qo[-|+]       Add quick open information [none|force]
  81.  -r             Recurse subdirectories
  82.  -ri<P>[:<S>]   Set priority (0-default,1-min..15-max) and sleep time in ms
  83.  -s-            Disable solid archiving
  84.  -t             Test files after archiving
  85.  -tk            Keep original archive time
  86.  -tl            Set archive time to newest file
  87.  -ts[m,c,a,p]   Save or restore time (modification, creation, access, preserve)
  88.  -u             Update files
  89.  -w<path>       Assign work directory
  90. #>
  91.  
  92. <#
  93. ===========================================================================================
  94. |                                                                                         |
  95. |                                        .NET Code                                        |
  96. |                                                                                         |
  97. ===========================================================================================
  98. #>
  99.  
  100. Add-Type -TypeDefinition @"
  101. using System;
  102. using System.Runtime.InteropServices;
  103.  
  104. public class Win32Functions {
  105.    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
  106.    public static extern long StrFormatByteSizeW(long fileSize, System.Text.StringBuilder buffer, int bufferSize);
  107. }
  108. "@
  109.  
  110. <#
  111. ===========================================================================================
  112. |                                                                                         |
  113. |                                    Functions                                            |
  114. |                                                                                         |
  115. ===========================================================================================
  116. #>
  117. function Show-WelcomeScreen {
  118.    Clear-Host
  119.    Write-Host ""
  120.    Write-Host " $($host.ui.RawUI.WindowTitle)"
  121.    Write-Host " +========================================================+"
  122.    Write-Host " |                                                        |"
  123.    Write-Host " | This script will use RAR.exe to compress each file in  |"
  124.    Write-Host " | the current working directory individually, each using |"
  125.    Write-Host " | different dictionary sizes, with max. compression,     |"
  126.    Write-Host " | generating this way multiple RAR files for evaluating  |"
  127.    Write-Host " | compression rates on these dictionary sizes.           |"
  128.    Write-Host " |                                                        |"
  129.    Write-Host " +=========================================================+"
  130.    Write-Host ""
  131.    Write-Host " Script Settings            " -ForegroundColor DarkGray
  132.    Write-Host " ===========================" -ForegroundColor DarkGray
  133.    Write-Host " RAR Executable Path: $([System.IO.Path]::GetFullPath($rarExecutablePath))" -ForegroundColor Gray
  134.    Write-Host "" -ForegroundColor DarkGray
  135.    Write-Host " Dictionary Sizes (Megabyte): $($dictionarySizes -join ', ')" -ForegroundColor Gray
  136.    Write-Host " The script will create a RAR archive for each specified dictionary size." -ForegroundColor DarkGray
  137.    Write-Host "" -ForegroundColor DarkGray
  138.    Write-Host " File Types To Keep Uncompressed: `$keepCompressedFileTypesUncompressed" -ForegroundColor Gray
  139.    Write-Host " The script will instruct RAR to don't compress the specified known compressed file types." -ForegroundColor DarkGray
  140.    Write-Host " (See `$keepCompressedFileTypesUncompressed variable definition to manage the file types)" -ForegroundColor DarkGray
  141.    Write-Host "" -ForegroundColor DarkGray
  142.    Write-Host " Tolerance File Size Difference: $toleranceSizeDiff" -ForegroundColor Gray
  143.    Write-Host " Any newly created RAR file whose file size compared to previously   " -ForegroundColor DarkGray
  144.    Write-Host " created RAR files is within the specified tolerance value, it will be deleted." -ForegroundColor DarkGray
  145.    Write-Host " For example, if `$toleranceSizeDiff value is 1MB:" -ForegroundColor DarkGray
  146.    Write-Host " If a created RAR file of 32 MB dict. size has a file size of 100 MB," -ForegroundColor DarkGray
  147.    Write-Host " and then a newly created RAR file of 64 MB dict. size has a file size of 99 MB, " -ForegroundColor DarkGray
  148.    Write-Host " the RAR file of 64 MB dict. size will be deleted because it only differs in 1MB or less." -ForegroundColor DarkGray
  149.    Write-Host "" -ForegroundColor DarkGray
  150.    Write-Host " Keep only smallest rar file: $keepOnlySmallestRarFile" -ForegroundColor Gray
  151.    Write-Host " If True, the script will delete any newly created RAR file " -ForegroundColor DarkGray
  152.    Write-Host " whose file size is bigger than previously created RAR files." -ForegroundColor DarkGray
  153.    Write-Host " Note: it takes into account the specified `$toleranceSizeDiff value." -ForegroundColor DarkGray
  154.    Write-Host "" -ForegroundColor DarkGray
  155.    Write-Host " Send RAR files to recycle bin: $sendRarFilesToRecycleBin" -ForegroundColor Gray
  156.    Write-Host " If True, the script will send RAR files to recycle bin instead of permanently deleting them." -ForegroundColor DarkGray
  157.    Write-Host ""
  158. }
  159.  
  160. function Confirm-Continue {
  161.    Write-Host " Press 'Y' key to continue or 'N' to exit."
  162.    Write-Host ""
  163.    Write-Host " -Continue? (Y/N)"
  164.    do {
  165.        $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  166.        $char = $key.Character.ToString().ToUpper()
  167.        if ($char -ne "Y" -and $char -ne "N") {
  168.            [console]::beep(1500, 500)
  169.        }
  170.    } while ($char -ne "Y" -and $char -ne "N")
  171.    if ($char -eq "N") {Exit(1)} else {Clear-Host}
  172. }
  173.  
  174. function Compress-Files {
  175.    Add-Type -AssemblyName Microsoft.VisualBasic
  176.  
  177.    $dictionarySizes = $dictionarySizes | Sort-Object
  178.  
  179.    # Partir y formatear la cadena de file types para acomodarlo a la linea de argumentos de rar.exe
  180.    if (-not [String]::IsNullOrEmpty($fileTypesToKeepUncompressed)) {
  181.        $fileTypeTokens = $fileTypesToKeepUncompressed -split ';'
  182.        $fileTypesArgumentLines = @()
  183.        for ($i = 0; $i -lt $fileTypeTokens.Count; $i += 20) {
  184.            $fileTypesArgumentLines += "-ms" + ($fileTypeTokens[$i..($i + 19)] -join ';') + [Environment]::NewLine
  185.        }
  186.        if ($fileTypesArgumentLines.Count -gt 0) {
  187.            $fileTypesArgumentLines[-1] = $fileTypesArgumentLines[-1] -replace [Environment]::NewLine, ''
  188.        }
  189.    } else {
  190.        $fileTypesArgumentLines = "-ms "
  191.    }
  192.  
  193.    foreach ($inputFile in Get-ChildItem -LiteralPath "$PSScriptRoot" -File) {
  194.  
  195.        if ($inputFile.Name -eq [System.IO.Path]::GetFileName($PSCommandPath)) {
  196.            continue
  197.        }
  198.  
  199.        # Keeps track of created rar files by rar.exe
  200.        $createdRarFiles = New-Object System.Collections.Generic.List[System.IO.FileInfo]
  201.  
  202.        foreach ($size in $dictionarySizes) {
  203.  
  204.            if (($size -ne $dictionarySizes[0]) -and ($inputFile.Length * 4) -le ($size * 1MB)) {
  205.                $formattedSize = Format-FileSize -fileSize $inputFile.Length
  206.                Write-Host "Ignoring compression with too big dictionary size of $size mb for a $formattedSize file: `"$($inputFile.Name)`"..." -ForegroundColor Yellow
  207.                continue
  208.            }
  209.  
  210.            $outputRarFilePath   = "$($inputFile.FullName)_$($size)mb.rar"
  211.            $errorLogFilePath = "$($inputFile.FullName)_$($size)mb_error.log"
  212.  
  213.            $arguments = @(
  214.                " a -u -ams -c- -cfg- -dh -ep1 -htb -idcdn -isnd- -iver -m5 -ma5 -md$($size)m",
  215.                " -o+ -oc -oh -oi2 -ol -oni -qo+ -r -ri0:0 -s- -t -tk -tl -tsmca+",
  216.                " $fileTypesArgumentLines",
  217.                " -x`"*\$($MyInvocation.MyCommand.Name)`"",
  218.                " -w`"$($env:TEMP)`"",
  219.                " -ilog`"$errorLogFilePath`"",
  220.                " -- `"$outputRarFilePath`"",
  221.                " -- `"$($inputFile.FullName)`""
  222.            )
  223.  
  224.            Write-Host "Compressing file with $size mb dictionary dize: `"$($inputFile.Name)`"..."
  225.            #Write-Host ""
  226.            #Write-Host "rar.exe arguments:" -ForegroundColor DarkGray
  227.            #Write-Host ($arguments -join [Environment]::NewLine) -ForegroundColor DarkGray
  228.  
  229.            $psi = New-Object System.Diagnostics.ProcessStartInfo
  230.            $psi.FileName = $rarExecutablePath
  231.            $psi.Arguments = $arguments -join ' '
  232.            $psi.RedirectStandardOutput = $false
  233.            $psi.UseShellExecute = $false
  234.            $psi.CreateNoWindow = $false
  235.  
  236.            $process = [System.Diagnostics.Process]::Start($psi)
  237.            $process.WaitForExit()
  238.  
  239.            $outputRarFile = New-Object System.IO.FileInfo($outputRarFilePath)
  240.            $formattedOutputRarFileSize = Format-FileSize -fileSize $outputRarFile.Length
  241.            Write-Host ""
  242.            Write-Host "Created rar with file name: $($outputRarFile.Name) ($formattedOutputRarFileSize)" -ForegroundColor DarkGreen
  243.  
  244.            if ($toleranceSizeDiff -ne $null) {
  245.                if ($createdRarFiles.Count -ne 0) {
  246.                    $outputRarFileMB = [Math]::Floor($outputRarFile.Length / $toleranceSizeDiff)
  247.                    $formattedOutputRarFileSize = Format-FileSize -fileSize $outputRarFile.Length
  248.  
  249.                    foreach ($rarFile in $createdRarFiles) {
  250.                        if ($rarFile.Exists) {
  251.                            $sizeMB = [Math]::Floor($rarFile.Length / $toleranceSizeDiff)
  252.                            $formattedRarFileSize = Format-FileSize -fileSize $rarFile.Length
  253.                            if ($outputRarFileMB -eq $sizeMB) {
  254.                                Write-Host ""
  255.                                Write-Host "File size of this created RAR file ($formattedOutputRarFileSize) is within the $toleranceSizeDiff tolerance difference" -ForegroundColor DarkGray
  256.                                Write-Host "than a previously created RAR file ($formattedRarFileSize) with smaller dictionary size..." -ForegroundColor DarkGray
  257.                                Write-Host "Deleting file: `"$($outputRarFile.Name)`" ($formattedOutputRarFileSize)..." -ForegroundColor Yellow
  258.                                if ($sendRarFilesToRecycleBin) {
  259.                                    [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($outputRarFile.FullName, 'OnlyErrorDialogs', 'SendToRecycleBin')
  260.                                } else {
  261.                                    [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($outputRarFile.FullName, 'OnlyErrorDialogs', 'DeletePermanently')
  262.                                }
  263.                                Write-Host "Deletion completed." -ForegroundColor Yellow
  264.                            }
  265.                        }
  266.                    }
  267.                }
  268.            }
  269.  
  270.            if (Test-Path -LiteralPath $outputRarFile.FullName -PathType Leaf) {
  271.                $createdRarFiles.Add($outputRarFile)
  272.            }
  273.            Write-Host ""
  274.        }
  275.  
  276.        if ($keepOnlySmallestRarFile -and $createdRarFiles.Count -gt 0) {
  277.            $existingFiles = $createdRarFiles | Where-Object { $_.Exists }
  278.            if ($existingFiles.Count -gt 0) {
  279.                Write-Host "`$keepOnlySmallestRarFile variable is `$True. Comparing file sizes of created RAR files..." -ForegroundColor Yellow
  280.                Write-Host ""
  281.                $smallestFile = $existingFiles | Sort-Object Length | Select-Object -First 1
  282.                foreach ($file in $existingFiles) {
  283.                    if ($file -ne $smallestFile) {
  284.                        $formattedFileSize = Format-FileSize -fileSize $file.Length
  285.                        Write-Host "Deleting file: `"$($file.Name)`" ($formattedFileSize)..." -ForegroundColor Yellow
  286.                        if ($sendRarFilesToRecycleBin) {
  287.                            [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($file.FullName, 'OnlyErrorDialogs', 'SendToRecycleBin')
  288.                        } else {
  289.                            [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($file.FullName, 'OnlyErrorDialogs', 'DeletePermanently')
  290.                        }
  291.                        Write-Host "Deletion completed." -ForegroundColor Yellow
  292.                        Write-Host ""
  293.                    }
  294.                }
  295.                $formattedSmallestFileSize = Format-FileSize -fileSize $smallestFile.Length
  296.                Write-Host "Smallest file kept: $($smallestFile.Name) ($formattedSmallestFileSize)" -ForegroundColor Green
  297.                Write-Host ""
  298.            }
  299.        }
  300.  
  301.    }
  302. }
  303.  
  304. function Format-FileSize {
  305.    param(
  306.        [long]$fileSize
  307.    )
  308.    $buffer = New-Object System.Text.StringBuilder 260
  309.    [Win32Functions]::StrFormatByteSizeW($fileSize, $buffer, $buffer.Capacity) | Out-Null
  310.    return $buffer.ToString()
  311. }
  312.  
  313. function Show-GoodbyeScreen {
  314.    Write-Host "Operation Completed!" -BackgroundColor Black -ForegroundColor Green
  315.    Write-Host ""
  316.    Write-Host "Press any key to exit..."
  317.    $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
  318.    Exit(0)
  319. }
  320.  
  321. <#
  322. ===========================================================================================
  323. |                                                                                         |
  324. |                                         Main                                            |
  325. |                                                                                         |
  326. ===========================================================================================
  327. #>
  328.  
  329. [System.Console]::Title = "RAR Multi-Compression Test Tool (Files) - by Elektro"
  330. #[System.Console]::SetWindowSize(150, 45)
  331. [CultureInfo]::CurrentUICulture = "en-US"
  332.  
  333. try { Set-ExecutionPolicy -ExecutionPolicy "Unrestricted" -Scope "Process" } catch { }
  334.  
  335. Show-WelcomeScreen
  336. Confirm-Continue
  337. Compress-Files
  338. Show-GoodbyeScreen
  339.  


« Última modificación: 3 Marzo 2024, 10:54 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.822



Ver Perfil
Re: [APORTE] [PowerShell] RAR.exe | Multi-Compression Test Tool (Para Archivos)
« Respuesta #1 en: 19 Marzo 2024, 01:42 am »

Comparto una versión actualizada del script. Las modificaciones se han basado en perfeccionar pequeños detalles y mejorar bastante la forma en que se compara el tamaño de los archivos ($toleranceSizeDiff).

Código
  1. <#
  2. ===========================================================================================
  3. |                                                                                         |
  4. |                                        Variables                                        |
  5. |                                                                                         |
  6. ===========================================================================================
  7. #>
  8.  
  9. $rarExecutablePath = "${env:ProgramFiles}\WinRAR\rar.exe"
  10. $dictionarySizesMb = @(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048)
  11. $toleranceSizeDiff = 100kb
  12. $keepOnlySmallestRarFile  = $true
  13. $sendRarFilesToRecycleBin = $false
  14.  
  15. $compressedFileTypesArchive = @(
  16.    "7z" , "arc", "bz2" , "bzip", "bzip2",
  17.    "gz" , "gz2", "gza" , "gzi" , "gzip" ,
  18.    "lha", "lz" , "lz4" , "lzh" , "lzma" ,
  19.    "rar", "sfx", "tgz" , "tlz" , "tlzma",
  20.    "uha", "zip", "zipx", "zpaq"
  21. )
  22.  
  23. $compressedFileTypesAudio = @(
  24.    "aac", "ac3", "fla","flac",
  25.    "m4a", "mp3", "ogg", "ogm",
  26.    "usm", "wma"
  27. )
  28.  
  29. $compressedFileTypesVideo = @(
  30.    "asf", "avc", "avi" , "bik" , "bk2" , "f4v" , "flv" ,
  31.    "m1v", "m2t", "m2ts", "m2v" , "m4v" , "mpv4",
  32.    "mkv", "mov", "mp4" , "mpeg", "mpg" , "mts" ,
  33.    "qt" , "ts" , "vob" , "vp6" , "webm", "wmv"
  34. )
  35.  
  36. $compressedFileTypesOther = @(
  37.    "avif", "jpeg", "jpg" , "gif" , "pdf",
  38.    "pam" , "paq6", "paq7", "paq8",
  39.    "par" , "par2", "wad"
  40. )
  41.  
  42.  
  43. [string]$fileTypesToKeepUncompressed = (
  44.    $compressedFileTypesArchive +
  45.    $compressedFileTypesAudio +
  46.    $compressedFileTypesVideo +
  47.    $compressedFileTypesOther
  48. ) -join ';'
  49.  
  50. <#
  51. ===========================================================================================
  52. |                                                                                         |
  53. |                    rar.exe commands (only those used in this script)                    |
  54. |                                                                                         |
  55. ===========================================================================================
  56.  
  57. <Commands>
  58.  a             Add files to archive
  59.  
  60. <Switches>
  61.  -am[s,r]       Archive name and time [save, restore]
  62.  -c-            Disable comments show
  63.  -cfg-          Ignore configuration file and RAR environment variable.
  64.  -dh            Open shared files
  65.  -ep1           Exclude base directory from names
  66.  -ht[b|c]       Select hash type [BLAKE2,CRC32] for file checksum
  67.  -id[c,d,n,p,q] Display or disable messages
  68.  -ilog[name]    Log errors to file
  69.  -isnd[-]       Control notification sounds
  70.  -m<0..5>       Set compression level (0-store...3-default...5-maximal)
  71.  -ma[4|5]       Specify a version of archiving format
  72.  -md<n>[k,m,g]  Dictionary size in KB, MB or GB
  73.  -ms[list]      Specify file types to store.
  74.  -o[+|-]        Set the overwrite mode
  75.  -oc            Set NTFS Compressed attribute.
  76.  -oh            Save hard links as the link instead of the file
  77.  -oi[0-4][:min] Save identical files as references
  78.  -ol[a]         Process symbolic links as the link [absolute paths]
  79.  -oni           Allow potentially incompatible names
  80.  -qo[-|+]       Add quick open information [none|force]
  81.  -r             Recurse subdirectories
  82.  -ri<P>[:<S>]   Set priority (0-default,1-min..15-max) and sleep time in ms
  83.  -s-            Disable solid archiving
  84.  -t             Test files after archiving
  85.  -tk            Keep original archive time
  86.  -tl            Set archive time to newest file
  87.  -ts[m,c,a,p]   Save or restore time (modification, creation, access, preserve)
  88.  -u             Update files
  89.  -w<path>       Assign work directory
  90. #>
  91.  
  92. <#
  93. ===========================================================================================
  94. |                                                                                         |
  95. |                                        .NET Code                                        |
  96. |                                                                                         |
  97. ===========================================================================================
  98. #>
  99.  
  100. Add-Type -TypeDefinition @"
  101. using System;
  102. using System.Runtime.InteropServices;
  103.  
  104. public class Win32Functions {
  105.    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
  106.    public static extern long StrFormatByteSizeW(long fileSize, System.Text.StringBuilder buffer, int bufferSize);
  107. }
  108. "@
  109.  
  110. <#
  111. ===========================================================================================
  112. |                                                                                         |
  113. |                                    Functions                                            |
  114. |                                                                                         |
  115. ===========================================================================================
  116. #>
  117. function Format-FileSize {
  118.    param(
  119.        [long]$fileSize
  120.    )
  121.    $buffer = New-Object System.Text.StringBuilder 260
  122.    [Win32Functions]::StrFormatByteSizeW($fileSize, $buffer, $buffer.Capacity) | Out-Null
  123.    return $buffer.ToString()
  124. }
  125.  
  126. function Show-WelcomeScreen {
  127.    Clear-Host
  128.    Write-Host ""
  129.    Write-Host " $($host.ui.RawUI.WindowTitle)"
  130.    Write-Host " +========================================================+"
  131.    Write-Host " |                                                        |"
  132.    Write-Host " | This script will use RAR.exe to compress each file in  |"
  133.    Write-Host " | the current working directory individually, each using |"
  134.    Write-Host " | different dictionary sizes, with max. compression,     |"
  135.    Write-Host " | generating this way multiple RAR files for evaluating  |"
  136.    Write-Host " | compression rates on these dictionary sizes.           |"
  137.    Write-Host " |                                                        |"
  138.    Write-Host " +=========================================================+"
  139.    Write-Host ""
  140.    Write-Host " Script Settings            " -ForegroundColor DarkGray
  141.    Write-Host " ===========================" -ForegroundColor DarkGray
  142.    Write-Host " RAR Executable Path: $([System.IO.Path]::GetFullPath($rarExecutablePath))" -ForegroundColor Gray
  143.    Write-Host "" -ForegroundColor DarkGray
  144.    Write-Host " Dictionary Sizes (Megabyte): $($dictionarySizesMb -join ', ')" -ForegroundColor Gray
  145.    Write-Host " The script will create a RAR archive for each specified dictionary size." -ForegroundColor DarkGray
  146.    Write-Host "" -ForegroundColor DarkGray
  147.    Write-Host " File Types To Keep Uncompressed: `$keepCompressedFileTypesUncompressed" -ForegroundColor Gray
  148.    Write-Host " The script will instruct RAR to don't compress the specified known compressed file types." -ForegroundColor DarkGray
  149.    Write-Host " (See `$keepCompressedFileTypesUncompressed variable definition to manage the file types)" -ForegroundColor DarkGray
  150.    Write-Host "" -ForegroundColor DarkGray
  151.    Write-Host " Tolerance File Size Difference: $(Format-FileSize -fileSize $toleranceSizeDiff)" -ForegroundColor Gray
  152.    Write-Host " Any newly created RAR file whose file size compared to previously   " -ForegroundColor DarkGray
  153.    Write-Host " created RAR files is within the specified tolerance value, it will be deleted." -ForegroundColor DarkGray
  154.    Write-Host " For example, if `$toleranceSizeDiff value is 1MB:" -ForegroundColor DarkGray
  155.    Write-Host " If a created RAR file of 32 MB dict. size has a file size of 100 MB," -ForegroundColor DarkGray
  156.    Write-Host " and then a newly created RAR file of 64 MB dict. size has a file size of 99 MB, " -ForegroundColor DarkGray
  157.    Write-Host " the RAR file of 64 MB dict. size will be deleted because it only differs in 1MB or less." -ForegroundColor DarkGray
  158.    Write-Host "" -ForegroundColor DarkGray
  159.    Write-Host " Keep only smallest RAR file: $keepOnlySmallestRarFile" -ForegroundColor Gray
  160.    Write-Host " If True, the script will delete any newly created RAR file " -ForegroundColor DarkGray
  161.    Write-Host " whose file size is bigger than previously created RAR files." -ForegroundColor DarkGray
  162.    Write-Host " Note: it takes into account the specified `$toleranceSizeDiff value." -ForegroundColor DarkGray
  163.    Write-Host "" -ForegroundColor DarkGray
  164.    Write-Host " Send RAR files to recycle bin: $sendRarFilesToRecycleBin" -ForegroundColor Gray
  165.    Write-Host " If True, the script will send RAR files to recycle bin instead of permanently deleting them." -ForegroundColor DarkGray
  166.    Write-Host ""
  167. }
  168.  
  169. function Confirm-Continue {
  170.    Write-Host " Press 'Y' key to continue or 'N' to exit."
  171.    Write-Host ""
  172.    Write-Host " -Continue? (Y/N)"
  173.    do {
  174.        $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  175.        $char = $key.Character.ToString().ToUpper()
  176.        if ($char -ne "Y" -and $char -ne "N") {
  177.            [console]::beep(1500, 500)
  178.        }
  179.    } while ($char -ne "Y" -and $char -ne "N")
  180.    if ($char -eq "N") {Exit(1)} else {Clear-Host}
  181. }
  182.  
  183. function Compress-Files {
  184.    Add-Type -AssemblyName Microsoft.VisualBasic
  185.  
  186.    $dictionarySizesMb = $dictionarySizesMb | Sort-Object
  187.  
  188.    # Partir y formatear la cadena de file types para acomodarlo a la linea de argumentos de rar.exe
  189.    if (-not [String]::IsNullOrEmpty($fileTypesToKeepUncompressed)) {
  190.        $fileTypeTokens = $fileTypesToKeepUncompressed -split ';'
  191.        $fileTypesArgumentLines = @()
  192.        for ($i = 0; $i -lt $fileTypeTokens.Count; $i += 20) {
  193.            $fileTypesArgumentLines += "-ms" + ($fileTypeTokens[$i..($i + 19)] -join ';') + [Environment]::NewLine
  194.        }
  195.        if ($fileTypesArgumentLines.Count -gt 0) {
  196.            $fileTypesArgumentLines[-1] = $fileTypesArgumentLines[-1] -replace [Environment]::NewLine, ''
  197.        }
  198.    } else {
  199.        $fileTypesArgumentLines = "-ms "
  200.    }
  201.  
  202.    foreach ($inputFile in Get-ChildItem -LiteralPath "$PSScriptRoot" -File) {
  203.  
  204.        if ($inputFile.Name -eq [System.IO.Path]::GetFileName($PSCommandPath)) {
  205.            continue
  206.        }
  207.  
  208.        # Keeps track of created rar files by rar.exe
  209.        $createdRarFiles = New-Object System.Collections.Generic.List[System.IO.FileInfo]
  210.  
  211.        foreach ($size in $dictionarySizesMb) {
  212.  
  213.            if (($size -ne $dictionarySizesMb[0]) -and ($inputFile.Length * 4) -le ($size * 1MB)) {
  214.                $formattedSize = Format-FileSize -fileSize $inputFile.Length
  215.                Write-Host "Ignoring compression with too big dictionary size of $size mb for a $formattedSize file: `"$($inputFile.Name)`"..." -ForegroundColor Yellow
  216.                continue
  217.            }
  218.  
  219.            $outputRarFilePath   = "$($inputFile.FullName)_$($size)mb.rar"
  220.            $errorLogFilePath = "$($inputFile.FullName)_$($size)mb_error.log"
  221.  
  222.            $arguments = @(
  223.                " a -u -ams -c- -cfg- -dh -ep1 -htb -idcdn -isnd- -iver -m5 -ma5 -md$($size)m",
  224.                " -o+ -oc -oh -oi2 -ol -oni -qo+ -r -ri0:0 -s- -t -tk -tl -tsmca+",
  225.                " $fileTypesArgumentLines",
  226.                " -x`"*\$($MyInvocation.MyCommand.Name)`"",
  227.                " -w`"$($env:TEMP)`"",
  228.                " -ilog`"$errorLogFilePath`"",
  229.                " -- `"$outputRarFilePath`"",
  230.                " -- `"$($inputFile.FullName)`""
  231.            )
  232.  
  233.            Write-Host "Compressing file with $size mb dictionary size: `"$($inputFile.Name)`"..."
  234.            #Write-Host ""
  235.            #Write-Host "rar.exe arguments:" -ForegroundColor DarkGray
  236.            #Write-Host ($arguments -join [Environment]::NewLine) -ForegroundColor DarkGray
  237.  
  238.            $previousForegroundColor = $host.UI.RawUI.ForegroundColor
  239.            $host.UI.RawUI.ForegroundColor = "DarkGray"
  240.            $psi = New-Object System.Diagnostics.ProcessStartInfo
  241.            $psi.FileName = $rarExecutablePath
  242.            $psi.Arguments = $arguments -join ' '
  243.            $psi.RedirectStandardOutput = $false
  244.            $psi.UseShellExecute = $false
  245.            $psi.CreateNoWindow = $false
  246.  
  247.            $process = [System.Diagnostics.Process]::Start($psi)
  248.            $process.WaitForExit()
  249.            $host.UI.RawUI.ForegroundColor = $previousForegroundColor
  250.  
  251.            $outputRarFile = New-Object System.IO.FileInfo($outputRarFilePath)
  252.            $formattedOutputRarFileSize = Format-FileSize -fileSize $outputRarFile.Length
  253.            Write-Host ""
  254.            Write-Host "Created rar with file name: $($outputRarFile.Name) ($formattedOutputRarFileSize) ($($outputRarFile.Length) bytes)" -ForegroundColor DarkGreen
  255.  
  256.            if ($toleranceSizeDiff -ne $null) {
  257.                if ($createdRarFiles.Count -ne 0) {
  258.                    $outputRarFileSize = $outputRarFile.Length
  259.                    $formattedOutputRarFileSize = Format-FileSize -fileSize $outputRarFileSize
  260.                    $formattedToleranceFileSize = Format-FileSize -fileSize $toleranceSizeDiff
  261.  
  262.                    foreach ($createdRarFile in $createdRarFiles) {
  263.                        if ($createdRarFile.Exists) {
  264.                            $createdRarFileSize = $createdRarFile.Length
  265.                            $formattedCreatedRarFileSize = Format-FileSize -fileSize $createdRarFileSize
  266.                            $diffSize = [Math]::Abs($createdRarFileSize - $outputRarFileSize)
  267.                            $formattedDiffSize = Format-FileSize -fileSize $diffSize
  268.  
  269.                            if (($outputRarFileSize + $toleranceSizeDiff) -ge $createdRarFileSize) {
  270.                                Write-Host ""
  271.                                Write-Host "Size of this created RAR file ($formattedOutputRarFileSize) ($outputRarFileSize bytes) is within the $formattedToleranceFileSize tolerance difference" -ForegroundColor Yellow
  272.                                Write-Host "than a previously created RAR file of $formattedCreatedRarFileSize ($createdRarFileSize bytes) with smaller dictionary size..." -ForegroundColor Yellow
  273.                                Write-Host "Size of this created RAR file only differs by $formattedDiffSize ($diffSize bytes)." -ForegroundColor Yellow
  274.                                Write-Host "Deleting file: `"$($outputRarFile.Name)`"..." -ForegroundColor Yellow
  275.                                if ($sendRarFilesToRecycleBin) {
  276.                                    [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($outputRarFile.FullName, 'OnlyErrorDialogs', 'SendToRecycleBin')
  277.                                } else {
  278.                                    [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($outputRarFile.FullName, 'OnlyErrorDialogs', 'DeletePermanently')
  279.                                }
  280.                                Write-Host "Deletion completed." -ForegroundColor Yellow
  281.                                break
  282.                            }
  283.                        }
  284.                    }
  285.                }
  286.            }
  287.  
  288.            if (Test-Path -LiteralPath $outputRarFile.FullName -PathType Leaf) {
  289.                $createdRarFiles.Add($outputRarFile)
  290.            }
  291.            Write-Host ""
  292.        }
  293.  
  294.        if ($keepOnlySmallestRarFile -and $createdRarFiles.Count -gt 0) {
  295.            $existingFiles = $createdRarFiles | Where-Object { $_.Exists }
  296.            if ($existingFiles.Count -gt 0) {
  297.                Write-Host "`$keepOnlySmallestRarFile variable is `$True. Comparing file sizes of created RAR files..." -ForegroundColor Yellow
  298.                Write-Host ""
  299.                $smallestFile = $existingFiles | Sort-Object Length | Select-Object -First 1
  300.                foreach ($file in $existingFiles) {
  301.                    if ($file -ne $smallestFile) {
  302.                        $formattedFileSize = Format-FileSize -fileSize $file.Length
  303.                        Write-Host "Deleting file: `"$($file.Name)`" ($formattedFileSize)..." -ForegroundColor Yellow
  304.                        if ($sendRarFilesToRecycleBin) {
  305.                            [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($file.FullName, 'OnlyErrorDialogs', 'SendToRecycleBin')
  306.                        } else {
  307.                            [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($file.FullName, 'OnlyErrorDialogs', 'DeletePermanently')
  308.                        }
  309.                        Write-Host "Deletion completed." -ForegroundColor Yellow
  310.                        Write-Host ""
  311.                    }
  312.                }
  313.                $formattedSmallestFileSize = Format-FileSize -fileSize $smallestFile.Length
  314.                Write-Host "Smallest file kept: $($smallestFile.Name) ($formattedSmallestFileSize)" -ForegroundColor Green
  315.                Write-Host ""
  316.            }
  317.        }
  318.  
  319.    }
  320. }
  321.  
  322. function Show-GoodbyeScreen {
  323.    Write-Host "Operation Completed!" -BackgroundColor Black -ForegroundColor Green
  324.    Write-Host ""
  325.    Write-Host "Press any key to exit..."
  326.    $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
  327.    Exit(0)
  328. }
  329.  
  330. <#
  331. ===========================================================================================
  332. |                                                                                         |
  333. |                                         Main                                            |
  334. |                                                                                         |
  335. ===========================================================================================
  336. #>
  337.  
  338. [System.Console]::Title = "RAR Multi-Compression Test Tool (Files) - by Elektro"
  339. #[System.Console]::SetWindowSize(150, 45)
  340. [CultureInfo]::CurrentUICulture = "en-US"
  341.  
  342. try { Set-ExecutionPolicy -ExecutionPolicy "Unrestricted" -Scope "Process" } catch { }
  343.  
  344. Show-WelcomeScreen
  345. Confirm-Continue
  346. Compress-Files
  347. Show-GoodbyeScreen
  348.  


« Última modificación: 19 Marzo 2024, 01:45 am por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines