web-dev-qa-db-fra.com

Extraction de .tar natif à Powershell

J'ai un fichier .tar.gz que je dois extraire. J'ai manipulé le bit gunzip avec l'objet GzipStream de System.IO.Compression, mais je n'ai rien trouvé qui permette de traiter les archives tarball dans cet espace de noms. Existe-t-il un moyen de traiter les fichiers .tar de manière native dans Powershell? Notez qu'il est seulement important que je puisse appeler toute binaire système/système/fonction/méthode/construction à partir d'un script Powershell; il n'a pas besoin d'être écrit en PowerShell. (Si c'est important, j'utilise Windows 10 bits)

P.S. s'il vous plaît ne dites pas "use 7Zip"; ce n'est pas natif

18
bfieck

Cela fait donc onze jours que j'ai posé cette question et le consensus général est le suivant: "Non, aucun outil natif dans une installation de fenêtre Vanilla ne peut gérer l'extraction de goudron" pour vous "". 

Cette réponse provient de Matthias R. Jensen et TessellatingHeckler , qui ont tous deux refusé de répondre en dehors des commentaires (je suppose qu'en raison du refus de dire "non" sans une connaissance intime de l'architecture système Windows dans son ensemble, qui est juste).

Il y a certes des scripts, des classes et des programmes que vous pouvez installer, mais rien de "natif".

3
bfieck

Je suis à peu près sûr que Windows 10 ne prend pas en charge l'extraction des fichiers tar par défaut.

1. La solution rapide et facile pour Windows 10

Si vous pouvez vous attendre à ce que le script ait accès à une connexion Internet active, vous pouvez simplement obtenir le support 7Zip à l'aide du gestionnaire de packages intégré. Cette solution:

  • Est entièrement automatisé via un script (ne nécessite pas d'interaction utilisateur)
  • Ne nécessite pas de privilèges d'administrateur
  • Installe le module de support 7Zip uniquement s'il n'est pas déjà disponible

C'est ici:

function Expand-Tar($tarFile, $dest) {

    if (-not (Get-Command Expand-7Zip -ErrorAction Ignore)) {
        Install-Package -Scope CurrentUser -Force 7Zip4PowerShell > $null
    }

    Expand-7Zip $tarFile $dest
}

Pour l'utiliser:

Expand-Tar archive.tar dest

Il fait le travail mais apporte une modification persistante au système client. Il existe une solution meilleure, mais légèrement plus complexe:

2. La meilleure solution

La meilleure solution consiste à regrouper 7Zip4PowerShell avec votre script. Cette solution:

  • Est entièrement automatisé via un script (ne nécessite pas d'interaction utilisateur)
  • Ne nécessite pas de privilèges administratifs
  • N'installe aucun logiciel sur le système client
  • Ne nécessite pas de connectivité Internet
  • Devrait fonctionner sur les versions antérieures de Windows

une. Téléchargez une copie du paquet 7Zip4PowerShell

Il est distribué sous la licence LGPL-2.1 et vous pouvez donc le regrouper avec votre produit. Vous devez ajouter à votre documentation une note indiquant qu'il utilise le package et fournir un lien, car vous devez fournir un accès au code source des produits sous licence GNU.

Save-Module -Name 7Zip4Powershell -Path .

Cela le téléchargera dans le répertoire actuel. Il est plus facile de le faire sous Windows 10, mais des instructions expliquant comment ajouter PowerShell Gallery à votre système sous des versions antérieures de Windows sont disponibles à partir du lien ci-dessus.

b. Importez le module lorsque vous devez extraire le fichier tar.

J'ai créé une fonction simple juste pour montrer comment vous pouvez le faire en vous basant sur la première solution:

function Expand-Tar($tarFile, $dest) {

    $pathToModule = ".\7Zip4Powershell\1.9.0\7Zip4PowerShell.psd1"

    if (-not (Get-Command Expand-7Zip -ErrorAction Ignore)) {
        Import-Module $pathToModule
    }

    Expand-7Zip $tarFile $dest
}

Vous devrez ajuster $pathToModule à l'emplacement de stockage du module fourni lors de l'exécution du script, mais vous devriez vous faire une idée. J'ai écrit cet exemple pour que vous puissiez simplement coller les deux blocs de code ci-dessus dans une fenêtre PowerShell et obtenir une cmdlet Expand-Tar active:

Expand-Tar archive.tar dest
10
Don Cruickshank

Solution possible:

J'ai Windows 10 et je voulais exécuter curl + tar au sein de Powershell, mais il manquait de support. Heureusement, j'avais Ubuntu bash sous Windows 10 qui est livré avec les versions curl et tar préinstallées et exécutées dans cet environnement, puis après le téléchargement et l'extraction, je suis retourné à Powershell pour continuer à faire ce que je faisais.

Ou comme @Don Cruickshank mentionné dans le commentaire ci-dessous, vous pouvez installer le support 7Zip directement dans PowerShell avec Install-Package 7Zip4Powershell. La cmdlet Expand-7Zip extraira plusieurs formats d'archive, y compris tar. 

Ces solutions de contournement ne résolvent pas votre problème particulier, mais peuvent s'avérer utiles pour celles bloquées sous Windows. 

6
Kunok

Voici le fragment d'un script PowerShell:

try
{
    Add-Type -AssemblyName "ICSharpCode.SharpZLib"

    $file = [IO.File]::OpenRead($gzArchiveName)
    $inStream=New-Object -TypeName ICSharpCode.SharpZipLib.GZip.GZipInputStream $file
    $tarIn = New-Object -TypeName ICSharpCode.SharpZipLib.Tar.TarInputStream $inStream
    $archive = [ICSharpCode.SharpZipLib.Tar.TarArchive]::CreateInputTarArchive($tarIn)
    $archive.ExtractContents($WORKDIR)
}
finally
{
    $archive.Close
}

qui est équivalent au code de TarTool.exe utility

1
user3161761

Cet extrait a fonctionné pour moi, je ne pense pas avoir installé quoi que ce soit qu'il utilise. Je dois encore trouver comment extraire le goudron que cela extrait.

Function DeGZip-File{
    Param(
        $infile
        )
    $outFile = $infile.Substring(0, $infile.LastIndexOfAny('.'))
    $input = New-Object System.IO.FileStream $inFile, ([IO.FileMode]::Open), ([IO.FileAccess]::Read), ([IO.FileShare]::Read)
    $output = New-Object System.IO.FileStream $outFile, ([IO.FileMode]::Create), ([IO.FileAccess]::Write), ([IO.FileShare]::None)
    $gzipStream = New-Object System.IO.Compression.GzipStream $input, ([IO.Compression.CompressionMode]::Decompress)

    $buffer = New-Object byte[](1024)
    while($true){
        $read = $gzipstream.Read($buffer, 0, 1024)
        if ($read -le 0){break}
        $output.Write($buffer, 0, $read)
        }

    $gzipStream.Close()
    $output.Close()
    $input.Close()
}

$infile='D:\[Directory]\[File].tar.gz'

DeGZip-File $infile 
0
user2197169