2019年更新:
正如其他答案所指出的,BSD tar 已于 2018 年作为内置命令添加到 Windows 10 中。如果您需要支持早期版本的 Windows,则本答案仍然适用。
我相当确定在 2018 年之前的 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
a. 下载7Zip4PowerShell软件包副本
它根据LGPL-2.1许可证分发,因此将软件包与您的产品捆绑在一起是可以的。您应该在文档中添加一条注释说明它使用了该软件包并提供一个链接,因为您需要为GNU许可证产品提供访问源代码的权限。
Save-Module -Name 7Zip4Powershell -Path .
这将会下载文件至当前目录。在Windows 10上执行此操作最为简单,但你可以通过上方链接中提供的说明,在早期版本的Windows中添加PowerShell Gallery到系统中。
b. 当你需要解压缩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
cmdlet:
Expand-Tar archive.tar dest
cURL
这样的高级工具(在Windows的原始安装中不可用)。希望这能帮助你解决任何你需要的问题。 - bfiecktar
和curl
。最初这只对Windows Insiders可用,但我相信现在所有的Windows 10用户都可以使用了(https://devblogs.microsoft.com/commandline/tar-and-curl-come-to-windows/)。它的工作方式就像你期望的那样,但我还是发了一个答案以防万一。 - Broper