如何在Powershell中压缩/解压缩文件?


Answers:


21

DotNetZip将允许您从PowerShell执行此操作。它不是单行的,但是该库允许您编写所需的PowerShell脚本。

您也可以使用COM界面,请参阅使用Windows PowerShell压缩文件,然后打包Windows Vista侧栏小工具

谷歌搜索“ zip powershell”或“ unzip powershell”也可能会得到有用的结果。


+1链接的文章具有与最不推荐的答案不同的有用任务
Ruben Bartelink,2012年

5
-1用于建议Google搜索。这是Google搜索“ unzip powershell”时遇到的顶级StackExchange结果
机器渴望

154

这是您完全可以从Powershell无需任何外部工具即可完成的方法。这会将名为test.zip的文件解压缩到当前工作目录中:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

26
使用$ destination.Copyhere($ zip_file.items(),0x10)覆盖现有文件。0x4隐藏该对话框,0x14合并这些内容并覆盖并隐藏该对话框。
彼得

3
该行$destination.Copyhere($zip_file.items())执行实际的解压缩。
乔纳森·艾伦,

2
如果需要,可以将以上内容打包为一个函数: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
James Holwell,2013年

6
这应该是公认的答案。
tugberk

2
当zip文件仅包含一个文件夹(项目为空)时,这对我来说失败了
James Woolfenden 2014年

56

现在,.NET Framework 4.5中提供了一个ZipFile类,您可以像这样使用:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

1
如果有一个简单的方法来ExtractToDirectory并覆盖所有现有文件的选项是巨大的。
James Dunne 2013年

1
这适用于.NET 4.5。但是,您确实也需要Powershell V3。
DalSoft 2013年

3
用Add-Type加载程序集,例如:Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike

2
@JamesDunne-如果没有其他需要保留的文件,可以使用“ Remove-Item -Recurse $ TargetFolder”。否则,您可以完成您想做的事情,但这并非易事。您需要打开zip进行阅读,然后遍历zip,删除以前的任何目标对象并解压缩新的对象。对我来说幸运的是,这种简单的解决方案有效。;)
Mike

3
请注意,相对文件位置将使用.NET当前目录,而不是 PowerShell 目录。看这里。仅就(Resolve-Path $someDir).Path论点而言可能更好。
jpmc26 '16

18

您可能希望检出具有专门用于此目的的cmdlet 的PowerShell社区扩展(PSCX)


1
+1 PSCX是一组很棒的附加cmdlet-我只是希望我可以选择更多我想要的和我不需要的。在我的Powershell实例中似乎正在改变很多
。...– marc_s

之所以遇到这种情况是因为,如果可以的话,我实际上想自动化PSCX安装。现在尝试一下,看看我遇到了什么问题
jcolebrand 2011年


5

我找到了最简单的解决方案,只使用我已经使用多年并且在UNIX环境中使用过的infozip二进制文件。

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

在文本输出周围放置一个Powershell包装器是很直接的,但是实际上我从不需要它,所以我没有打扰。

http://www.info-zip.org/


5

我还喜欢Info-ZIP(在大多数其他Zip实用程序中都可以找到的Zip引擎)和7-Zip,这是另一个同时具有GUI和命令行Zip实用程序的收藏夹。关键是,有一些优秀的命令行实用程序可用于大多数PowerShell任务。

有一些运行命令行实用程序的技巧,这些实用程序不是在考虑使用PowerShell构建的:

  • 运行以名称开头的数字开头的可执行文件,并在其前面加上“&”号(&)。

    &7zip.exe

  • 实用程序希望在命令行中用引号将每个令牌包装起来。

    &“ c:\带有空格的路径\ SomeCommand.exe”“ / parameter2”“ / parameter2”“参数2的值”“值2`”用引号引起来“

尝试这个:

zip filename.zip (Get-ChildItem somepath\*)

甚至:

zip filename.zip (Get-Content ListOfFiles.txt)

2

詹姆斯·霍尔威尔(James Holwell),我喜欢您的回答,但我扩大了一点

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}



0

我创建了一个与PowerShell 2.0兼容的模块,该模块使用本机Windows OS命令以同步方式压缩和解压缩文件。这适用于较旧的操作系统,例如Windows XP,并且不需要.Net 4.5或任何其他外部工具。该功能还将阻止脚本执行,直到所有文件都已压缩/解压缩为止。您可以在我的博客上找到更多信息和该模块

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.