script - Extracción nativa de.tar en Powershell
powershell script example (8)
¿Por qué realmente no usarías 7zip?
Si hay una regla de negocios que niega tales herramientas, tratar de implementar una solución es una tarea de tontos. En un entorno de este tipo, debe hablar con las partes interesadas y:
- obtener un permiso para usar las herramientas requeridas
- Mueva el proceso a otro. Un sistema en el que se permite el uso de herramientas.
- cambiar el sistema de origen para enviar archivos sin etiquetar
- Explique que los requisitos como tales no se pueden cumplir.
Tengo un archivo .tar.gz
que necesito extraer. He manejado el bit gunzip con el objeto GzipStream
de System.IO.Compression
, pero no pude encontrar nada para tratar con los GzipStream
en ese espacio de nombres. ¿Hay una manera de tratar con archivos .tar
forma nativa en Powershell? Tenga en cuenta que solo es importante que pueda llamar a cualquier función / método / construcción de objeto / sistema binario desde un script de Powershell; no es necesario que esté escrito en powershell. (Si importa estoy usando Windows 10 de 64 bits)
PS por favor no digas "usar 7zip"; eso no es nativo
Así que han pasado once días desde que pregunté esto y el consenso general es: "No, no hay herramientas nativas en una instalación de ventanas de vainilla que puedan manejar la extracción de alquitrán ''para usted''".
Esta respuesta proviene de Matthias R. Jensen y TessellatingHeckler , quienes se negaron a responder fuera de los comentarios (sospecho que no quiero decir "no" sin un conocimiento íntimo de toda la arquitectura del sistema de Windows, lo cual es justo).
Ciertamente hay scripts y clases y programas que puedes instalar, pero nada "nativo".
Creo que tar
se ha agregado como una función nativa en Windows 10 desde la publicación de este.
Desde el símbolo del sistema o PowerShell en Windows 10 puedo ejecutar
tar -xvzf ./whatever.tar.gz
Tenga en cuenta que ./
Se agregó después de la finalización automática mediante el uso de la tab
en PowerShell, pero creo que debería funcionar sin eso.
Puede haber algunas diferencias subyacentes entre esta función y su implementación de Unix (ya que está en Windows después de todo), pero funcionó para mí.
Este es el fragmento para un script de 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
}
que es equivalente al código de la utilidad TarTool.exe
Este fragmento ha estado funcionando para mí, no creo que tenga nada instalado que esté usando. Todavía tengo que averiguar cómo extraer el alquitrán que se extrae.
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
Windows 10 desde 2017 tar -xkf $archivePath -C $outDir
tar
por lo que puede ejecutarse como es habitual en pwsh
. Desde powershell
como tar -xkf $archivePath -C $outDir
, o mejor desde pwsh
.
Actualización en 2019:
Como se señaló en otras respuestas, BSD tar se agregó a Windows 10 como un comando integrado en 2018. Esta respuesta aún es aplicable si necesita admitir versiones anteriores de Windows.
Estoy bastante seguro de que Windows 10 no tenía soporte para extraer archivos tar de forma predeterminada antes de 2018.
1. La solución rápida y fácil para (versiones anteriores de) Windows 10
Si puede esperar que la secuencia de comandos tenga acceso a una conexión de Internet activa, simplemente puede obtener soporte de 7Zip utilizando el administrador de paquetes integrado. Esta solución:
- Está completamente automatizado a través de script (no requiere la interacción del usuario)
- No requiere privilegios de administrador.
- Solo instala el módulo de soporte 7Zip si aún no está disponible
Aquí está:
function Expand-Tar($tarFile, $dest) {
if (-not (Get-Command Expand-7Zip -ErrorAction Ignore)) {
Install-Package -Scope CurrentUser -Force 7Zip4PowerShell > $null
}
Expand-7Zip $tarFile $dest
}
Para usarlo:
Expand-Tar archive.tar dest
Hace el trabajo pero hace un cambio persistente en el sistema cliente. Hay una solución mejor, pero un poco más complicada:
2. La mejor solución.
La mejor solución es empaquetar 7Zip4PowerShell con su script. Esta solución:
- Está completamente automatizado a través de script (no requiere la interacción del usuario)
- No requiere privilegios administrativos.
- No instala ningún software en el sistema cliente.
- No requiere conectividad a internet.
- Debería funcionar en versiones anteriores de Windows
a. Descargue una copia del paquete 7Zip4PowerShell
Se distribuye bajo la licencia LGPL-2.1 y, por lo tanto, está bien empaquetar el paquete con su producto. Debe agregar una nota a su documentación de que usa el paquete y proporcionar un enlace, ya que se le exige que proporcione acceso al código fuente para los productos con licencia GNU.
Save-Module -Name 7Zip4Powershell -Path .
Esto lo descargará al directorio actual. Es más fácil hacer esto en Windows 10, pero hay instrucciones sobre cómo agregar la Galería PowerShell a su sistema en versiones anteriores de Windows desde el enlace anterior.
segundo. Importe el módulo cuando necesite extraer el archivo tar.
He hecho una función simple solo para demostrar cómo puedes hacer esto en base a la primera solución:
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
}
Deberá ajustar $pathToModule
al lugar donde realmente se almacena el módulo empaquetado cuando se ejecuta el script, pero debe tener la idea. He escrito este ejemplo de manera que simplemente puede pegar los dos bloques de código anteriores en una ventana de PowerShell y obtener un cmdlet Expand-Tar
funcione:
Expand-Tar archive.tar dest
Posible solución:
Tengo Windows 10 y quería ejecutar curl
+ tar
dentro de Powershell pero carecía de soporte. Por suerte, tuve Ubuntu bash en Windows 10, que viene con curl
y tar
preinstalado y lo ejecuté en ese entorno, luego, después de la descarga y la extracción, volví a Powershell para continuar con lo que fuera que estaba haciendo.
O como menciona en el comentario a continuación, puede instalar el soporte 7zip desde PowerShell directamente con Install-Package 7Zip4Powershell
. El cmdlet Expand-7zip
extraerá múltiples formatos de archivo, incluido tar.
Estas soluciones no resuelven su problema particular, pero para estas que están atascadas con Windows, pueden ser útiles.