Исходное извлечение .tar в Powershell

У меня есть файл .tar.gz, который нужно извлечь. Я обработал бит gunzip с GzipStream объектом из System.IO.Compression, но я не смог найти ничего для работы с tarball в этом пространстве имен. Есть ли способ иметь дело с .tar файлами изначально в Powershell? Обратите внимание, что только важно, чтобы я мог вызвать любую такую ​​конструкцию/метод/объект/бинарную конструкцию объекта из Powershell script; на самом деле его не нужно писать в powershell. (Если это важно, я использую 64-битные окна 10)

P.S. пожалуйста, не говорите "используйте 7zip"; что не родной

Ответ 1

Итак, прошло уже одиннадцать дней с тех пор, как я спросил об этом, и общий консенсус гласит: "Нет, нет никаких встроенных инструментов в установке окна ванили, которая может обрабатывать извлечение tar" для вас ".

Этот ответ исходит от Маттиаса Р. Йенсена и TessellatingHeckler, которые оба отказались отвечать на внешние вопросы (я подозреваю, что я не хочу сказать "нет" без глубокого знания всей системной архитектуры Windows, что справедливо).

Есть, конечно, скрипты и классы и программы, которые вы можете установить, но ничего "родного".

Ответ 2

Я вполне уверен, что Windows 10 по умолчанию не поддерживает извлечение файлов tar.

1. Быстрое простое решение для Windows 10

Если вы ожидаете, что у скрипта будет доступ к активному интернет-соединению, вы можете просто получить поддержку 7Zip с помощью встроенного менеджера пакетов. Это решение:

  • Полностью автоматизирован с помощью скрипта (не требует взаимодействия с пользователем)
  • Не требует прав администратора
  • Устанавливает модуль поддержки 7Zip, только если он еще не доступен

Вот:

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

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

    Expand-7Zip $tarFile $dest
}

Чтобы использовать это:

Expand-Tar archive.tar dest

Он выполняет свою работу, но вносит постоянные изменения в клиентскую систему. Есть лучшее, но немного более сложное решение:

2. Лучшее решение

Лучшее решение - связать 7Zip4PowerShell с вашим скриптом. Это решение:

  • Полностью автоматизирован с помощью скрипта (не требует взаимодействия с пользователем)
  • Не требует административных привилегий
  • Не устанавливает никакого программного обеспечения в клиентской системе
  • Не требует подключения к интернету
  • Должен работать на более ранних версиях Windows

а. Загрузите копию пакета 7Zip4PowerShell

Он распространяется под лицензией LGPL-2.1, и поэтому все в порядке, чтобы связать пакет с вашим продуктом. Вы должны добавить примечание к своей документации, что он использует пакет, и предоставить ссылку, поскольку вам необходимо предоставить доступ к исходному коду для лицензированных продуктов GNU.

Save-Module -Name 7Zip4Powershell -Path .

Это загрузит его в текущий каталог. Это проще всего сделать в Windows 10, но есть инструкции о том, как добавить PowerShell Gallery в вашу систему в более ранних версиях Windows, по ссылке выше.

б. Импортируйте модуль, когда вам нужно извлечь файл tar

Я сделал простую функцию, чтобы продемонстрировать, как вы можете сделать это на основе первого решения:

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
}

Вам нужно будет настроить $pathToModule там, где на самом деле хранится связанный модуль, когда ваш скрипт запускается, но вы должны понять это. Я написал этот пример так, что вы можете просто вставить оба блока кода выше в окно PowerShell и получить работающий командлет Expand-Tar:

Expand-Tar archive.tar dest

Ответ 3

Возможное решение:

У меня Windows 10, и я хотел запустить curl + tar в Powershell, но ему не хватало поддержки. К счастью, у меня была Ubuntu bash на Windows 10, которая поставляется с предустановленными curl и tar и я запустил ее в этой среде, а затем после загрузки и распаковки я переключился обратно на Powershell, чтобы продолжить все, что я делал.

Или, как упомянуто в комментарии @Don Cruickshank ниже, вы можете установить поддержку 7zip из PowerShell напрямую с помощью Install-Package 7Zip4Powershell. Командлет Expand-7zip извлекает несколько форматов архивов, включая tar.

Эти обходные пути не решают вашу конкретную проблему, но для тех, которые застряли в Windows, могут быть полезны.

Ответ 4

Это фрагмент для PowerShell script:

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
}

что эквивалентно коду утилита TarTool.exe

Ответ 5

Этот фрагмент работает для меня, я не думаю, что у меня есть что-то, что оно использует. Мне все еще нужно выяснить, как извлечь tar, чтобы это вышло.

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 

Ответ 6

В Windows 10, начиная с 2017 года, tar -xkf $archivePath -C $outDir tar поэтому она может запускаться как обычно exe из powershell например tar -xkf $archivePath -C $outDir или лучше из pwsh.

Ответ 7

Почему бы вам не использовать 7zip?

Если существует бизнес-правило, которое опровергает такие инструменты, попытка реализовать обход - это безумное поручение. В такой среде вам нужно поговорить с заинтересованными сторонами и либо:

  • получить разрешение на использование необходимых инструментов
  • переместить процесс в другую систему, в которой разрешено использование инструмента.
  • изменить исходную систему для отправки неаргированных файлов
  • объяснить, что требования как таковые не могут быть удовлетворены