Powershell中的原生.tar提取

bfi*_*eck 24 powershell tar

我有一个.tar.gz我需要提取的文件.我用GzipStream对象处理了gunzip位System.IO.Compression,但我找不到任何处理该命名空间中的tarball的东西.有没有办法.tar在Powershell中本地处理文件?请注意,我能够从Powershell脚本调用任何此类函数/方法/对象构造/系统二进制文件是非常重要的.它不需要实际写在powershell中.(如果重要的话我正在使用64位窗口10)

PS请不要说"使用7zip"; 那不是原生的

Bro*_*per 35

我相信tar自发布以来已在 Windows 10 中作为本机功能添加。

我可以从 Windows 10 中的命令提示符或 PowerShell 运行

tar -xvzf .\whatever.tar.gz
Run Code Online (Sandbox Code Playgroud)

请注意,在 PowerShell 中.\使用 自动完成后添加了tab,但我认为它应该可以在没有它的情况下工作。

这个函数和它的 Unix 实现之间可能有一些根本的区别(因为它毕竟是在 Windows 上),但它对我有用。

  • 这非常有效!我在一个文件夹中有多个 tar.gz 文件,并且使用了如下命令:`gci *.tar.gz | ForEach-Object {tar -xvzf $_}` 解压缩所有这些。它还为每个 tar 文件创建一个单独的文件夹。顺便说一句,这是在运行 Powershell v.5.1 的 Windows Server 2019 Standard 上进行的。 (5认同)

Don*_*ank 18

我很确定Windows 10默认情况下不支持提取tar文件.

1.适用于Windows 10的快速简便解决方案

如果您可以期望脚本可以访问活动的Internet连接,那么您可以使用内置的包管理器获得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
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

Expand-Tar archive.tar dest
Run Code Online (Sandbox Code Playgroud)

它完成了这项工作,但它对客户端系统进行了持久的更改.有一个更好但更复杂的解决方案:

2.更好的解决方案

更好的解决方案是将7Zip4PowerShell与您的脚本捆绑在一起.此解决方案:

  • 通过脚本完全自动化(不需要用户交互)
  • 不需要管理权限
  • 不在客户端系统上安装任何软件
  • 不需要互联网连接
  • 应该适用于早期版本的Windows

一个.下载7Zip4PowerShell软件包的副本

它是根据LGPL-2.1许可证分发的,因此可以将软件包与您的产品捆绑在一起.您应该在文档中添加一个注释,它使用该包并提供链接,因为您需要提供对GNU许可产品的源代码的访问权限.

Save-Module -Name 7Zip4Powershell -Path .
Run Code Online (Sandbox Code Playgroud)

这会将其下载到当前目录.最简单的方法是在Windows 10上执行此操作,但有关于如何从上面的链接在早期版本的Windows上将PowerShell库添加到系统的说明.

湾 需要提取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
}
Run Code Online (Sandbox Code Playgroud)

$pathToModule在脚本运行时,您需要调整捆绑模块的实际存储位置,但您应该明白这一点.我编写了这个示例,您只需将上面的两个代码块粘贴到PowerShell窗口中即可获得一个有效的Expand-Tarcmdlet:

Expand-Tar archive.tar dest
Run Code Online (Sandbox Code Playgroud)

  • 我相信“tar”和“curl”的实现已在 2018 年初左右添加到 Windows 10 中 (https://devblogs.microsoft.com/commandline/tar-and-curl-come-to-windows/)。它的工作方式与 Unix 命令类似,但我也发布了一个答案。 (2认同)

Kun*_*nok 6

可能的解决方法:

我有Windows 10,我想在Powershell中运行curl+ tar但它缺乏支持.幸运的是,我在Windows 10上安装Ubuntu bash,curltar在该环境中预先安装并运行它,然后在下载和解压后,我切换回Powershell继续我正在做的事情.

或者正如@Don Cruickshank在下面的评论中提到的,您可以直接在PowerShell中安装7zip支持Install-Package 7Zip4Powershell.该Expand-7zipcmdlet将提取多种存档格式,包括tar.

这些解决方法无法解决您的特定问题,但对于那些坚持使用Windows的解决方案可能会有用.

  • 在Windows 10中,您可以使用"Install-Package 7Zip4Powershell"直接在PowerShell中安装7zip支持.`Expand-7zip` cmdlet将提取多种存档格式,包括tar. (2认同)

bfi*_*eck 1

自从我问这个问题以来已经过去十一天了,普遍的共识是:“不,在普通窗口安装中没有可以‘为您’处理焦油提取的本机工具”。

这个答案来自Matthias R. JensenTessellationHeckler,他们都拒绝在评论之外回答(我怀疑是因为在不熟悉整个 Windows 系统架构的情况下不想说“不”,这是公平的)。

当然,您可以安装一些脚本、类和程序,但没有“本机”的。