【问题标题】:How to unzip a Zip File with Powershell Version 2.0?如何使用 Powershell 2.0 版解压缩 Zip 文件?
【发布时间】:2016-10-15 07:19:57
【问题描述】:

这适用于我的 PowerShell 版本 4.0 或更高版本。但在 PowerShell 2.0 版中,Add-Type 是不可能的(类型不存在)。

function unzip {
    Add-Type -Assembly “system.io.compression.filesystem”

    [io.compression.zipfile]::ExtractToDirectory("SOURCEPATH\ZIPNAME", "DESTINATIONPATH")
}

【问题讨论】:

标签: powershell powershell-2.0 powershell-4.0


【解决方案1】:
function Expand-ZIPFile($file, $destination)
{
   $shell = new-object -com shell.application
   $zip = $shell.NameSpace($file)
   foreach($item in $zip.items())
   {
      $shell.Namespace($destination).copyhere($item)
   }
}

这通过 Shell.Application 对象利用 Windows 的内置 zip 文件支持。要使用它,请运行以下命令。

>Expand-ZipFile .\Myzip.zip -destination c:\temp\files

来源:http://www.howtogeek.com/tips/how-to-extract-zip-files-using-powershell/

【讨论】:

    【解决方案2】:

    PowerShell 版本只是一个症状。这不是问题的实际原因。用于处理 zip 存档的相关类已添加到具有 .NET Framework 4.5(PowerShell v4 的先决条件)的 System.IO.Compression 命名空间,并且在 earlier versions 中不可用。安装 .NET Framework 4.5 版,您也可以在 PowerShell v2 中使用 IO.Compression.ZipFile 类。

    但是,在 PowerShell v2 中

    Add-Type -Assembly "System.IO.Compression.Filesystem"
    

    即使您安装了 .NET Framework 4.5,也会抛出无法找到程序集的错误,因此您需要将该行替换为

    [Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.Filesystem")
    

    并将 .Net Framework 配置更改为 always use the latest CLR(否则 PowerShell v2 将使用 .Net Framework 2.0 而不是 4.5):

    reg add HKLM\SOFTWARE\Microsoft\.NETFramework /v OnlyUseLatestCLR /t REG_DWORD /d 1
    

    正如@FoxDeploy 所建议的那样,即使没有 .NET Framework 4.5,也可以使用 Shell.Application COM 对象。但请注意,CopyHere() 方法是异步运行的,即它会立即返回,而无需等待实际的复制操作完成。如果要从脚本运行它,则需要添加某种延迟,因为Shell.Application 对象在脚本终止时会自动销毁,从而中止未完成的复制操作。

    【讨论】:

    • 然后出现如下错误信息: PS C:\Users\test> [Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.Filesystem") PS C:\Users\test > [io.compression.zipfile]::ExtractToDirectory("C:\WIN_AGENT.zip", "C:\test\") 找不到类型 [io.compression.zipfile]:确保包含此类型的程序集是加载。在 line:1 char:25 + [io.compression.zipfile]
    • 不幸的是,我不允许更改实际的 .NET Framework 版本。使用的 .NET Framework 版本为 2.0。
    • 这个答案不正确。首先,在 PowerShell V2 中可以使用 Add-Type 。其次,[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.Filesystem") 不适用于 PowerShell V2,因为它使用 .NET 2。
    • @richb 到目前为止,您是对的,Add-Type 在 PowerShell v2 中可用。但是,如果您运行Add-Type -Assembly 'System.IO.Compression.Filesystem',您会看到它抱怨无法找到程序集。此外,[Reflection.Assembly]::LoadWithPartialName() 在 PowerShell v2 中不起作用是不正确的。你只需要做到use the latest CLR version
    • 有趣的 Ansgar 我不知道。对于我的用例,它没有用。我想要一个在普通 Windows 7 上运行的脚本。如果我要更改每台计算机上的注册表以使其正常工作,我不妨安装 PowerShell 5。我还在那个答案中注意到 cmets 关于强制 PS 的负面影响2 在 .NET 4 上运行。尽管如此,这是一个有趣的 hack 并且感谢您提供的信息。
    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多