【问题标题】:Zip individual files in powershell version 3在 powershell 版本 3 中压缩单个文件
【发布时间】:2022-01-23 13:21:38
【问题描述】:

我们有 windows 2012 服务器和 powershell 版本 3。我正在尝试根据日期条件将日志文件单独压缩到文件夹中。 Compress-Archive 在版本 3 中不可用。 我们没有任何 3rd 方 zip 实用程序,例如 WinZip、7z..etc 我尝试使用 [System.IO.Compression.ZipFile] 类,但它没有压缩单个文件的灵活性。

我的要求是,根据日期捕获日志文件并通过循环发送它们以压缩每个文件并删除原始文件。非常感谢您在这方面的帮助。

提前致谢。

【问题讨论】:

  • 我会将服务器上的 Powershell 升级到版本 5。
  • 如果升级 PowerShell 不是一个选项,那么请考虑在具有更高版本 PowerShell 的服务器/计算机上执行此操作,远程或通过在本地复制文件然后将它们复制回来
  • 感谢您抽出宝贵时间回答我的问题。在这里升级不是我的选择。复制文件以共享和压缩它们的过程是乏味的工作。
  • 令人头疼的是,COM 是不使用第三方工具的唯一选择
  • 将文件移动到一个专用的临时目录并在上面使用[System.IO.Compression.ZipFile] 。

标签: windows powershell zip


【解决方案1】:

这个答案很好用——它使用的是 COM 而不是纯 .NET 方法:

https://serverfault.com/a/456496/204875

不过,老实说,我强烈建议下载 7zip 的便携版本并使用它。无需安装,效率更高、速度更快。如果你可以分发一个脚本,你通常可以用它来分发一个 exe(虽然,是的,一些环境受到严格监管)。

示例:

$srcdir = "C:\tmp\in"
$zipFilepath = "C:\tmp\out"
$files = Get-ChildItem -Path $srcdir | where{! $_.PSIsContainer}

foreach($file in $files) { 
    $zipFilename = $file.name -replace '\.\w+$','.zip'
    $zipFile = "$zipFilepath\$zipFilename"
    #Prepare zip file
    if(-not (test-path($zipFile))) {
        set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
        (dir $zipFile).IsReadOnly = $false  
    }
    else { 
        # exit loop if zipfile with same name exists
        write-warning "$zipfile exists" 
        Continue
    }
    # create new COM object
    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipFile)
    $zipPackage.CopyHere($file.FullName)
    #using this method, sometimes files can be 'skipped'
    #this 'while' loop checks each file is added before moving to the next
    while($zipPackage.Items().Item($file.name) -eq $null){
        Start-sleep -milliseconds 250
    }
}
write-host "zipfiles created"

结果:

> 目录-递归 目录:C:\tmp\in 模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- -a---- 2021 年 12 月 30 日下午 4:12 5157 txt1.txt -a---- 2021 年 12 月 30 日下午 4:12 5157 txt2.txt -a---- 2021 年 12 月 30 日下午 4:12 5157 txt3.txt -a---- 2021 年 12 月 30 日下午 4:12 5157 txt4.txt 目录:C:\tmp\out 模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- -a---- 2021 年 12 月 30 日下午 4:13 1997 txt1.zip -a---- 2021 年 12 月 30 日下午 4:14 1997 txt2.zip -a---- 2021 年 12 月 30 日下午 4:14 1997 txt3.zip -a---- 2021 年 12 月 30 日下午 4:14 1997 txt4.zip

【讨论】:

  • 感谢您抽出宝贵时间。不幸的是,您提供的链接有一个代码可以将多个文件压缩成一个压缩文件。我的要求是阅读所有 txt 文件并单独压缩它们。稍后,我需要删除原来的txt文件。
  • 抱歉不清楚 - 这种方法可以适应一次只做一个文件。基本上,您将对 dir 内容执行 Get-ChildItem,然后脚本中的几乎所有其他内容都将 inside 移动到 Foreach ($file...) 循环 - 创建一个唯一的目标 zipfile 名称,创建一个新的 $zippackage新的 zipfile 名称,将 $file 复制到 $zippackage(仅一个文件),然后转到下一个循环并使用下一个 $file 再次重复所有操作。
  • 我在原始答案中添加了一个示例。您可以看到压缩效率有多低,但总比没有好。我用于类似问题的另一个解决方案是在每个目录中创建一个压缩的“存档”子文件夹,然后简单地将文件移动到该文件夹​​中——这样会更快一些,尤其是对于较小的文件。
猜你喜欢
  • 2014-06-12
  • 2017-11-03
  • 1970-01-01
  • 2017-07-02
  • 2015-03-02
  • 2016-10-15
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多