Share via


PowerShell - SharpCompress and untar

 #needed to untar a tar.gz file and found the SharpCompress package, which will do it all!
#region InstallPackage SharpCompress
if  (-NOT (Get-Package -Name 'SharpCompress' -ErrorAction SilentlyContinue)) {
  #need to install it
  if (Find-Package -Name 'SharpCompress' -ErrorAction SilentlyContinue) {
     Find-Package -Name SharpCompress  | Install-Package -Verbose }
  else {
    if (-NOT (Get-PackageSource -Name 'nuGet.org v2' -ErrorAction SilentlyContinue)) {
      Register-PackageSource -Name 'nuGet.org v2' -ProviderName NuGet -Location "https://www.nuget.org/api/v2/"
    }
    if (Find-Package -Name 'SharpCompress' -Source 'nuGet.org v2' -ErrorAction SilentlyContinue) {
      Find-Package -Name SharpCompress -Source 'nuGet.org v2' | Install-Package -Verbose
   }
  }
}
#endregion
#region AddType SharpCompress
 $pkg=Get-Package -Name 'SharpCompress'
 $packageLocation = $pkg.Source
 $folder=$packageLocation.Substring(0,$packageLocation.LastIndexOf('\')) + '\lib\'
 $dll = Get-ChildItem -Path $folder -recurse -Include *.dll | Sort-Object -Descending | Select-Object -First 1 
 Add-Type -Path $dll.FullName
#endregion

function Extract-CompressedFile {
 [Alias('UnTar')]
 [Alias('UnZip')]
 [Alias('UnRar')]
 [CmdletBinding()]
 PARAM ([Parameter(Mandatory=$true, ValueFromPipeline=$true,Position=0)] [string]$sourcefile, 
        [Parameter(Mandatory=$true,Position=1)] [string]$destinationDirectory)

 
if (-NOT (Test-Path -Path $sourcefile)) {
 Write-Error -Message ('{0} File Not Found.' -f $sourcefile)
 return 
} 
if (-NOT (Test-Path -Path $destinationDirectory -IsValid)) {
 Write-Error -Message ('{0} Is not a valid target path.' -f $destinationDirectory)
 return 
}
 
# use the generic ReaderFactory. It will open anything.
# if it's a tar.gz, we'll go straight to the Tar file.
$filestream=[System.IO.File]::OpenRead($Sourcefile)
$reader=[SharpCompress.Readers.ReaderFactory]::Open($filestream)
 While ($reader.MoveToNextEntry()) {
   Write-Verbose -Message $reader.Entry.Key
   if ($reader.Entry.IsDirectory) {
     $folder = $reader.Entry.Key
     $destDir = Join-path -Path $DestinationDirectory -ChildPath $folder
     if (-NOT (Test-Path -Path $destDir)) {
      $null=New-Item -Path $destDir -ItemType Directory -Force }
     } 
     else {
      $file = $reader.Entry.Key
      $filepath = Join-Path -Path $DestinationDirectory -ChildPath $file
      if (Test-Path -Path $filepath) {
       Remove-Item -Path $filepath -Force -Verbose
      }
      $CreateNew = [System.IO.FileMode]::CreateNew
      $fs=[System.IO.File]::Open($filepath, $CreateNew)
      $reader.WriteEntryTo($fs)
      $fs.close()
    }
 }
$filestream.Close()
}
 
$Source= "$HOME\Downloads\tar-latest.tar.gz"
$Destination = 'C:\TEMP'
 
#Extract-CompressedFile -sourcefile $source -destinationDirectory $Destination
UnTar "$HOME\Downloads\tar-latest.tar.gz" "C:\TEMP"