[APORTE] [PowerShell] RAR.exe | Test RAR Files

(1/1)

Eleкtro:
El siguiente script, desarrollado en PowerShell y dependiente del programa de terceros WinRAR (rar.exe), sirve para analizar la integridad de los archivos RAR que haya en el directorio donde se ejecute el script.







El script genera un archivo con nombre "RAR_Test_Files.log" en el directorio de trabajo, donde se registran los nombres de archivos de los tests fallidos. En este ejemplo:

RAR_Test_Files.log
Citar

Código:

Failed test with exit code 3: C:\Nueva carpeta\Stupid Invaders (Spanish) (Disc 1)_128mb.rar



Test RAR Files.ps1
Código
<#
===========================================================================================
|                                                                                         |
|                                        Variables                                        |
|                                                                                         |
===========================================================================================
#>
 
$rarExecutablePath = "${env:ProgramFiles}\WinRAR\rar.exe"
$recursiveSearch   = $true
$logErrorFilePath  = "$PSScriptRoot\RAR_Test_Files.log"
 
<#
===========================================================================================
|                                                                                         |
|                                    Functions                                            |
|                                                                                         |
===========================================================================================
#>
 
function Show-WelcomeScreen {
   Clear-Host
   Write-Host ""
   Write-Host " $($host.ui.RawUI.WindowTitle)"
   Write-Host " +===================================================+"
   Write-Host " |                                                   |"
   Write-Host " | This script will use RAR.exe to test each file in |"
   Write-Host " | the current working directory, and inform about   |"
   Write-Host " | any errors found during the test.                 |"
   Write-Host " |                                                   |"
   Write-Host " +===================================================+"
   Write-Host ""
   Write-Host " Script Settings            " -ForegroundColor DarkGray
   Write-Host " ===========================" -ForegroundColor DarkGray
   Write-Host " RAR Executable Path: $([System.IO.Path]::GetFullPath($rarExecutablePath))" -ForegroundColor DarkGray
   Write-Host " Recursive Search...: $recursiveSearch" -ForegroundColor DarkGray
   Write-Host ""
}
 
function Confirm-Continue {
   Write-Host " Press 'Y' key to continue or 'N' to exit."
   Write-Host ""
   Write-Host " -Continue? (Y/N)"
   do {
       $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
       $char = $key.Character.ToString().ToUpper()
       if ($char -ne "Y" -and $char -ne "N") {
           [console]::beep(1500, 500)
       }
   } while ($char -ne "Y" -and $char -ne "N")
   if ($char -eq "N") {Exit(1)} else {Clear-Host}
}
 
function Test-RarFiles {
   Write-Host "Fetching RAR files, please wait..." -ForegroundColor DarkGray
   Write-Host ""
 
   $rarFiles = $null
   if ($recursiveSearch) {
       $rarFiles = Get-ChildItem -LiteralPath "$PSScriptRoot" -Filter "*.rar" -Recurse -File
   } else {
       $rarFiles = Get-ChildItem -LiteralPath "$PSScriptRoot" -Filter "*.rar" -File
   }
 
   $rarFileCount = $rarFiles.Count
   $currentFileCount = 0
 
   If ($rarFileCount -eq 0) {return}
 
   $testSuccessCount = 0
   $testFailCount = 0
 
   $logStream = [System.IO.StreamWriter]::new($logErrorFilePath, $false)
   foreach ($rarFile in $rarFiles) {
       $currentFileCount +=1
       Write-Host "RAR File $currentFileCount of $($rarFileCount):" -ForegroundColor DarkGray
 
       $psi = New-Object System.Diagnostics.ProcessStartInfo
       $psi.FileName = $rarExecutablePath
       $psi.Arguments = "t -idcdn `"$($rarFile.FullName)`""
       $psi.RedirectStandardOutput = $false
       $psi.UseShellExecute = $false
       $psi.CreateNoWindow = $false
 
       $process = [System.Diagnostics.Process]::Start($psi)
       $process.WaitForExit()
       $exitCode = $process.ExitCode
 
       if ($exitCode -eq 0) {
           Write-Host "RAR process exited with code: $exitCode" -ForegroundColor Green
           $testSuccessCount +=1
       } else {
           Write-Warning "RAR process exited with code: $exitCode"
           $logStream.WriteLine("Failed test with exit code $($exitCode): $($rarFile.FullName)")
           $testFailCount +=1
       }
       Write-Host ""
   }
   $logStream.Close()
 
   $SuccessPercent = [string]::Format("{0:F0}", ($testSuccessCount / $currentFileCount) * 100)
   if ($testSuccessCount -eq $currentFileCount) {
       Write-Host "RAR Tests Successful: $testSuccessCount of $currentFileCount ($SuccessPercent%)" -BackgroundColor Black -ForegroundColor Green
   } else {
       Write-Warning "RAR Tests Successful: $testSuccessCount of $currentFileCount ($SuccessPercent%)"
   }
 
   $FailPercent = [string]::Format("{0:F0}", ($testFailCount / $currentFileCount) * 100)
   if ($testFailCount -eq 0) {
       Write-Host "RAR Tests Failed....: $testFailCount of $currentFileCount ($FailPercent%)" -BackgroundColor Black -ForegroundColor Green
   } else {
       Write-Warning "RAR Tests Failed....: $testFailCount of $currentFileCount ($FailPercent%)"
   }
 
}
 
function Show-GoodbyeScreen {
   Write-Host ""
   Write-Host "Operation Completed!" -BackgroundColor Black -ForegroundColor Green
   Write-Host ""
   Write-Host "Press any key to exit..."
   $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
   Exit(0)
}
 
<#
===========================================================================================
|                                                                                         |
|                                         Main                                            |
|                                                                                         |
===========================================================================================
#>
 
[System.Console]::Title = "Test RAR Files - by Elektro"
#[System.Console]::SetWindowSize(150, 45)
[CultureInfo]::CurrentUICulture = "en-US"
 
try { Set-ExecutionPolicy -ExecutionPolicy "Unrestricted" -Scope "Process" } catch { }
 
Show-WelcomeScreen
Confirm-Continue
Test-RarFiles
Show-GoodbyeScreen
 

Navegación

[0] Índice de Mensajes