Исходное извлечение .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?
Если существует бизнес-правило, которое опровергает такие инструменты, попытка реализовать обход - это безумное поручение. В такой среде вам нужно поговорить с заинтересованными сторонами и либо:
- получить разрешение на использование необходимых инструментов
- переместить процесс в другую систему, в которой разрешено использование инструмента.
- изменить исходную систему для отправки неаргированных файлов
- объяснить, что требования как таковые не могут быть удовлетворены