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
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".
Je suis à peu près sûr que Windows 10 ne prend pas en charge l'extraction des fichiers tar par défaut.
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:
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:
La meilleure solution consiste à regrouper 7Zip4PowerShell avec votre script. Cette solution:
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.
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
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.
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
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