无法使用 Powershell 2.0 压缩文件

Posted

技术标签:

【中文标题】无法使用 Powershell 2.0 压缩文件【英文标题】:Unable to compress a file with Powershell 2.0 【发布时间】:2019-06-27 11:13:18 【问题描述】:

第一季度。我尝试了一些压缩方法,但在我的机器上都没有。我只能使用外部 zip 工具 7z.exe 来压缩文件,但我没有权限在 serverA 中安装 7z.exe 文件,也没有将 powershell 更新到 v5 的权限。 当前使用 powershell v2 尝试如下,但没有一个工作。那么,还有其他方法可以介绍我压缩文件吗?

添加类型-程序集“system.io.compression.filesystem” 压缩存档 Add-Type -Path C:\Reference\Draftdoc.docx C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

第二季度。下面是我使用 7z.exe 工具的查询(这个 serverB 确实带有 7z.exe)但我遇到了错误。我想用今天的日期压缩任何文件。

$timestamp = (Get-Date).ToString('yyyy-MM')
$source = "D:\csv\*.csv", "D:\csv2\*.csv"
$target = "D:\CSV2_$timestamp.zip"
$7zip = "D:\Program Files\7-Zip\7z.exe"

#Compressed file
if (-not (test-path $7zip)) throw '$7zip needed' 
set-alias sz $7zip  

sz a -mx=9 $target $source

    Get-ChildItem $source | Where$_.LastWriteTime -gt (Get-Date).AddDays(-1)

注意:两台服务器我也需要压缩文件,但服务器A没有7z,但服务器B确实有7z.exe

【问题讨论】:

【参考方案1】:

您必须使用更旧的Shell.Application COM Object method。

function Extract-Zip

    param([string]$zipfilename, [string] $destination)

    if(test-path($zipfilename))
       
        $shellApplication = new-object -com shell.application
        $zipPackage = $shellApplication.NameSpace($zipfilename)
        $destinationFolder = $shellApplication.NameSpace($destination)
        $destinationFolder.CopyHere($zipPackage.Items())
    

请注意,我认为这仅适用于 Windows Vista 或 Server 2008 或更高版本。如果您使用的是 Server 2003(但您不应该使用),那么据我所知,您将不得不使用第三方软件。

不言而喻,但您迫切需要更新您的服务器。我并不是说您需要安装最新的 PowerShell。我是说您显然使用的是 Server 2008 R2 或更早版本,而现在是 2019 年。

【讨论】:

我正在使用 Window Server 2008 和 Powershell v2 :'D 这种方法是否适用于 Window Server 2016。我将在明年升级到 WS2016 在升级之前我将自动压缩文件优先。 @user3542587 是的,它也应该适用于 2016 年。这使用了 Windows Explorer 使用的 zip 组件,因此任何具有本机 ZIP 支持的 Windows 版本都应该可以工作。我不记得它是否存在于 XP/2k3 中,但我知道它存在于 Vista/2k8 中。但是,您最终应该更新您的代码以使用本机 Expand-Archive,因为 COM 对象在 PowerShell 中可能有点不稳定。它们不使用 .Net 对象,因此它们的工作效果不如原生 .Net 类。【参考方案2】:

这应该可行:

Add-Type -Assembly "System.IO.Compression.FileSystem"
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $destinationZip)

请参阅Add-Type: Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found 了解加载所需程序集的替代方法

【讨论】:

我不相信 PowerShell 2(随 Windows 7 和相应的服务器版本 - 2008R2,IIRC 一起提供)支持此功能。使用 PowerShell 2,查询者的唯一选择可能是使用外部压缩程序,如 7Zip。如果他没有足够的权限在服务器上安装它,他可能需要联系他的系统管理员以获得进一步的帮助。 @mhu Add-Type :无法添加类型。找不到程序集“system.io.compression.filesystem”。我在上面的帖子中提到过。 @JeffZeitlin 感谢您的澄清。我认为这只是发生在我身上,无法使用不同的压缩语法。顺便说一句,知道如何处理 Q2 吗? 在不知道您遇到什么错误的情况下,甚至无法开始解决问题的艺术。【参考方案3】:

根据你的第二个问题,7z安装在ServerB的哪个位置,这个函数归档你想要的文件,这个代码不依赖你的powershell版本。

function Compress-Items ($ItemsPaths, $dest) 
    $Path = "D:\Program Files\7-Zip\7z.exe"
    $argList = "a -tzip -y `"$dest`""
    foreach ($item in $ItemsPaths) 
        $argList += " `"$item`""
    

    Start-Process -FilePath $Path -ArgumentList $argList


$source = (get-childitem -Path "D:\csv", "D:\csv2" -Include "*.csv" -Recurse).FullName
Compress-Items -ItemsPaths $source -dest $destination

注意

我修改了您的$source,因为这是获取您想要的所有 csv 文件的正确方法。

【讨论】:

以上是关于无法使用 Powershell 2.0 压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

将SharePoint Online Client组件(Microsoft.SharePoint.Client)与powershell 2.0一起使用

作为计划任务运行时,Powershell 脚本无法访问文件

如何将 PowerShell 版本从 2.0 升级到 3.0

使用 PowerShell 2.0 在远程计算机上运行批处理文件

Azure devops powershell 任务问题

使用 powershell 压缩旧文件