在PowerShell中是否存在一种可以对文件(* .zip)进行zip / unzip压缩的单行代码?

评论

相关:在服务器核心中使用PS解压缩

#1 楼

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

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

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

评论


+1链接的文章具有有用的任务,与最受欢迎的答案不同

– Ruben Bartelink
2012年4月10日上午10:09

-1用于建议Google搜索。这是Google搜索“ unzip powershell”时排名靠前的StackExchange结果

–机器向往
15年8月20日在9:59

#2 楼

这是您完全可以从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())


评论


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

–彼得
2011年4月19日下午4:06

$ destination.Copyhere($ zip_file.items())行执行实际的解压缩。

–乔纳森·艾伦
2011-10-28 22:02

您可以根据需要将以上内容打包为一个函数:function unzip($ filename){if(!(test-path $ filename)){抛出“ $ filename不存在”}} $ shell = new-object -com shell .application $ shell.namespace($ pwd.path).copyhere($ shell.namespace((join-path $ pwd $ filename))。items())}

–詹姆斯·霍尔威尔(James Holwell)
2013年1月29日11:19



这应该是公认的答案。

–tugberk
13年4月19日在21:06

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

–詹姆斯·伍尔芬登(James Woolfenden)
2014年8月19日在9:16

#3 楼

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

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


评论


如果有一个简单的ExtractToDirectory方法和一个覆盖所有现有文件的选项,那将很好。

–詹姆斯·邓恩
13年4月2日,0:43

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

– DalSoft
2013年6月16日19:29

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

–迈克
2013年9月19日下午2:39

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

–迈克
2013年9月19日在2:44

请注意,相对文件位置将使用.NET当前目录,而不是PowerShell目录。看这里。最好是将(Resolve-Path $ someDir).Path作为参数的路径。

– jpmc26
16年8月13日在3:45



#4 楼

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

评论


+1 PSCX是一组很棒的附加cmdlet-我只是希望我可以选择更多我想要的和我不需要的。在我的Powershell实例中,它似乎正在发生很大变化。

– marc_s
09年6月12日在7:48

之所以遇到这个问题是因为,如果可以的话,我实际上想自动化PSCX安装。现在尝试看看我遇到了什么样的问题

– jcolebrand
2011年4月27日在15:02

#5 楼

我知道这是一个非常老的问题,但我只是看到它在Twitter上的链接,以为我会发布当前答案。

PowerShell 5,目前可在Windows 10或Windows Management Framework 5上使用。生产预览版,带有两个用于“压缩”和“解压缩”的内置cmdlet:


压缩存档
扩展存档


评论


为旧问题提供新信息是一件好事。 ;)+1

– jpmc26
16年8月13日在3:16



#6 楼

我找到了最简单的解决方案,仅使用多年来在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/

#7 楼

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

运行一些不是在PowerShell中构建的命令行实用程序的技巧:



运行以数字开头的可执行文件在名称中,以“&”号开头(&)。

&7zip.exe


包装每个令牌,该实用程序希望从命令行中看到,用引号引起来。

&“ c:\带有空格的路径\ SomeCommand.exe”“ / parameter2”“ / parameter2”“ parameter2的值”“ Value2`”用引号“


尝试一下:

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


甚至:

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


#8 楼

詹姆斯·霍尔威尔(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()) 
}


#9 楼

WinRAR可以在接受参数的CMD模式下工作

#10 楼

离子方法的作用:

https://dotnetzip.codeplex.com/wikipage?title=PS-示例

支持密码,其他加密方法等。

#11 楼

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