Convert all ZIP files to 7Z in a Directory with PowerShell
This is a somewhat useful script for mass converting all ZIP files in a directory to 7Z.
The use case for me was having a massive amount of ZIP files in a directory that I wanted to convert to 7Z so that I could consolidate another directory that had similar files in 7Z format. Before using, make sure you do the following:
- Change the directories in the Variables section.
- Run VS Code in Admin mode and install the 7Zip4Powershell module. (see Description section below)
- Put your ZIP files into the convert directory.
- Empty the extract directory.
<# .SYNOPSIS Converts all Zip files in a directory to 7z files. .DESCRIPTION Converts all Zip files in a directory to 7z files. Requires 7Zip4Powershell module. To install, use this command in admin mode: Install-Module -Name 7Zip4PowerShell -Verbose .PARAMETER .EXAMPLE .NOTES Version History: 05172019 - Some user comfort features (progress displays) 05162019 - First version .LINK https://junkdrawer.saturnforge.com #> ############################################################################### ## Modules ############################################################################### # Need 7Zip4Powershell Import-Module -name 7Zip4Powershell ############################################################################### ## Variables ############################################################################### # What directory are your zip files in? $convertDirectory = "D:\7ZConvert\ConvertDirectory\" # Temp directory for placing extacted files $extractDirectory = "D:\7ZConvert\TempExtract\" # Where do you want the new 7z files placed? $compressDirectory = "D:\7ZConvert\CompressDirectory\" ############################################################################### ## Arrays & Hash tables ############################################################################### $directoryTestList = @( "$convertDirectory", "$extractDirectory", "$compressDirectory" ) ############################################################################### ## Functions ############################################################################### ## VERIFICATION FUNCTIONS # Check a path to make sure it's there; exit if not # COMPLETE Function Test-DirectoryPresence { Param ($testDirectory) $testDirectory = $testDirectory.trim() If (Test-Path -Path $testDirectory ) { Write-Host -BackgroundColor Black -ForegroundColor Green "$testDirectory is present, continuing..." } Else { # Quit Write-Host -BackgroundColor Black -ForegroundColor Red "$testDirectory is inaccessible! Exiting..." Throw "Directory presence check failed." } } # Checks to make sure a file is there; exits if not # Needs a full path with file name Function Test-FilePresence { Param ($testFile) $testFile = $testFile.trim() If (Test-Path -Path $testFile -PathType Leaf) { Write-Host -BackgroundColor Black -ForegroundColor Green "$testFile is present, continuing..." } Else { Write-Host -BackgroundColor Black -ForegroundColor Red "$testFile is inaccessible! Exiting..." Throw "File presence check failed." } } # Checks to make sure a directory is empty Function Test-DirectoryEmpty { Param ($testDirectory) If ((Get-ChildItem -Path $testDirectory -File -Force).Count -gt 0) { Write-Host -BackgroundColor Black -ForegroundColor Red "Directory $testDirectory still has files in it. Deleting..." Remove-Item -Path $testDirectory -Force -Recurse Write-Host -BackgroundColor Black -ForegroundColor Cyan "Recreating extract directory: $testDirectory" New-Item -Path $testDirectory -ItemType Directory Test-DirectoryPresence $testDirectory } Else { Write-Host -BackgroundColor Black -ForegroundColor Green "$testDirectory is empty, continuing..." } } ## OTHER FUNCTIONS # Main conversion function, needs a directory to act on Function Convert-To7z { Param ($Directory) # First we need a list of files $fileArray = Get-ChildItem -Path $directory -Filter *.zip -Name $fileCount = (Get-ChildItem -Path $directory -Filter *.zip).Count $i = 0 ForEach ($file in $fileArray) { $i++ $oldFile = $Directory + $file $newFile = $file.replace(".zip",".7z") $newFullFile = $compressDirectory + $newFile $progress = ($i / $filecount) * 100 $progress = [Math]::Round($progress,2) # Write-Host -BackgroundColor Black -ForegroundColor Magenta "Old file: $oldFile" # Write-Host -BackgroundColor Black -ForegroundColor Magenta "New file: $newFullFile" Write-Host -BackgroundColor Black -ForegroundColor Cyan "Progress: $i / $fileCount ($progress %)" # Extract the old zip file Write-Host -BackgroundColor Black -ForegroundColor Cyan "`n > Extracting: $oldFile" Expand-7Zip -ArchiveFileName $oldFile -TargetPath $extractDirectory # Now compress the contents to a new 7z file Write-Host -BackgroundColor Black -ForegroundColor Cyan "`n > Compressing: $newFullFile" Compress-7Zip -ArchiveFileName $newFullFile -Path $extractDirectory -Format SevenZip -CompressionLevel Ultra # Remove the extracted files Get-ChildItem -Path $extractDirectory -Recurse | ForEach-object {Remove-Item -Recurse -path $_.FullName } Test-DirectoryEmpty $extractDirectory # Check to make sure the new file is there Test-FilePresence $newFullFile } } ############################################################################### ## Technologic: Main Script ############################################################################### ## VERIFICATION PHASE # Confirm the services exist; will exit if not there Write-Host -BackgroundColor Black -ForegroundColor White "################################################################################" Write-Host -BackgroundColor Black -ForegroundColor White "Zip to 7Z Mass Converter" Write-Host -BackgroundColor Black -ForegroundColor White "################################################################################" Write-Host -BackgroundColor Black -ForegroundColor White "`n >>> Beginning verification phase." # Confirm directories exist ForEach ($directory in $directoryTestList) { Test-DirectoryPresence $directory } ## RE-COMPRESSION PHASE # Do it Write-Host -BackgroundColor Black -ForegroundColor White "`n >>> Beginning conversion phase." Convert-To7z $convertDirectory Write-Host -BackgroundColor Black -ForegroundColor White "################################################################################" Write-Host -BackgroundColor Black -ForegroundColor White "Conversion process complete!" Write-Host -BackgroundColor Black -ForegroundColor White "################################################################################" # You're still here? The script is over. Go home. ############################################################################### ## Scratchpad ############################################################################### <# #>