【问题标题】:How to zip files created on a specific date using powershell? [duplicate]如何使用powershell压缩在特定日期创建的文件? [复制]
【发布时间】:2016-12-12 23:54:15
【问题描述】:

我有一个脚本可以压缩在特定日期创建的所有文件。

Add-Type -AssemblyName System.IO.Compression.FileSystem 

$logfolder = "c:\users\riteshthakur\desktop\abc"
$startdate = "20161205"
$enddate = "20161205"

[System.IO.Compression.ZipArchive] $arch = [System.IO.Compression.ZipFile]::Open('c:\users\riteshthakur\desktop\arch.zip', [System.IO.Compression.ZipArchiveMode]::Update)

Get-ChildItem - path $logFolder | 
Where-Object {$_.CreationDate -gt $startDate -and $_.CreationDate -lt $endDate} | 
foreach{[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($arch,$_.FullName,$_.Name)}
# archive will be updated with files after you close it. normally, in C#, you would use "using ZipArchvie arch = new ZipFile" and object would be disposed upon exiting "using" block. here you have to dispose manually:
$arch.Dispose()

我正在运行这个脚本,但它抛出:“无法添加类型。找不到程序集 'System.IO.Compression.FileSystem'。”

请帮忙。

【问题讨论】:

  • Powershell中有Compress-ArchiveExpand-Archive(不确定它们出现在哪个版本中)。
  • 它们在 powershell 5.0 版中。我仍在使用 powershell 4.0
  • 很确定这是一个 .Net 框架问题(请参阅其他答案)。如果我错了,请告诉我,我们可以撤回反对票。

标签: powershell powershell-4.0


【解决方案1】:

根据https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v=vs.110).aspx,该程序集直到 .NET Framework 4.5 才可用。您安装了哪个版本的 .NET Framework?如果您有 4.5 或更高版本,您可能需要重新安装/修复它。

【讨论】:

    【解决方案2】:

    Originally published by Bryan C. O'Connell,这里有一个 Zip 函数:

    # Purpose: Creates a .zip file of a file or folder.
    # Params:
    # -target: The file or folder you would like to zip.
    #
    # -zip_to: The location where the zip file will be created. If an old version
    # exists, it will be deleted.
    #
    # -compression (optional): Sets the compression level for your zip file. Options:
    # a. fast - Higher process speed, larger file size (default option).
    # b. small - Slower process speed, smaller file size.
    # c. none - Fastest process speed, largest file size.
    #
    # -add_timestamp (optional): Applies a timestamp to the .zip file name.
    # By default, no timestamp is used.
    #
    # -confirm (optional): When provided, indicates that you would like to be
    # prompted when the zip process is finished.
    #
    # |Info|
    
    [CmdletBinding()]
    Param (
      [Parameter(Mandatory=$true,Position=0)]
      [string]$target,
    
      [Parameter(Mandatory=$true,Position=1)]
      [string]$zip_to,
    
      [Parameter(Mandatory=$false,Position=2)]
      [ValidateSet("fast","small","none")]
      [string]$compression,
    
      [Parameter(Mandatory=$false,Position=3)]
      [bool]$timestamp,
    
      [Parameter(Mandatory=$false,Position=4)]
      [bool]$confirm
    )
    
    #-----------------------------------------------------------------------------#
    function DeleteFileOrFolder
    { Param([string]$PathToItem)
    
      if (Test-Path $PathToItem)
      {
        Remove-Item ($PathToItem) -Force -Recurse;
      }
    }
    
    function DetermineCompressionLevel{
    [Reflection.Assembly]::LoadFile('C:\WINDOWS\System32\zipfldr.dll')
    Add-Type -Assembly System.IO.Compression.FileSystem
      $CompressionToUse = $null;
    
      switch($compression)
      {
        "fast" {$CompressionToUse = [System.IO.Compression.CompressionLevel]::Fastest}
        "small" {$CompressionToUse = [System.IO.Compression.CompressionLevel]::Optimal}
        "none" {$CompressionToUse = [System.IO.Compression.CompressionLevel]::NoCompression}
        default {$CompressionToUse = [System.IO.Compression.CompressionLevel]::Fastest}
      }
    
      return $CompressionToUse;
    }
    
    #-----------------------------------------------------------------------------#
    Write-Output "Starting zip process...";
    
    if ((Get-Item $target).PSIsContainer)
    {
      $zip_to = ($zip_to + "\" + (Split-Path $target -Leaf) + ".zip");
    }
    else{
    
      #So, the CreateFromDirectory function below will only operate on a $target
      #that's a Folder, which means some additional steps are needed to create a
      #new folder and move the target file into it before attempting the zip process. 
      $FileName = [System.IO.Path]::GetFileNameWithoutExtension($target);
      $NewFolderName = ($zip_to + "\" + $FileName)
    
      DeleteFileOrFolder($NewFolderName);
    
      md -Path $NewFolderName;
      Copy-Item ($target) $NewFolderName;
    
      $target = $NewFolderName;
      $zip_to = $NewFolderName + ".zip";
    }
    
    DeleteFileOrFolder($zip_to);
    
    if ($timestamp)
    {
      $TimeInfo = New-Object System.Globalization.DateTimeFormatInfo;
      $CurrentTimestamp = Get-Date -Format $TimeInfo.SortableDateTimePattern;
      $CurrentTimestamp = $CurrentTimestamp.Replace(":", "-");
      $zip_to = $zip_to.Replace(".zip", ("-" + $CurrentTimestamp + ".zip"));
    }
    
    $Compression_Level = (DetermineCompressionLevel);
    $IncludeBaseFolder = $false;
    
    [Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" );
    [System.IO.Compression.ZipFile]::CreateFromDirectory($target, $zip_to, $Compression_Level, $IncludeBaseFolder);
    
    Write-Output "Zip process complete.";
    
    if ($confirm)
    {
      write-Output "Press any key to quit ...";
      $quit = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");
    }
    

    如下使用:

    zip.ps1 -target "C:\Projects\test" -zip_to "C:\projects\test2" [-compression fast] [-timestamp] [-confirm]
    

    【讨论】:

    • 发布的代码尝试添加原始发布者所说的生成错误的相同程序集。为什么这里会出现同样的错误not
    • @JeffZeitlin:我相信出现错误的系统在此路径C:\WINDOWS\System32\zipfldr.dll 下没有 zipfldr.dll。您能否检查该文件是否存在。默认情况下它应该在那里,特别是如果你使用任何 winrar 或 7zip
    • 好吧,不知何故,我第一次错过了[Reflection.Assembly]::LoadFile('C:\WINDOWS\System32\zipfldr.dll'),这可能会使函数作为一个整体运行。我不相信即使加载了该程序集,紧随其后的 Add-Type 也不会引发与原始发帖人询问的相同的错误。
    • 我不这么认为。它不应该。如果您遇到任何错误,请您发布错误或屏幕截图。实际上我已经使用了很长时间,如果 dll 存在,我从来没有遇到过任何问题。
    • 我目前无法进行测试,因为我安装了 .NET 4.6.2,所以 Add-Type 适合我。但是,在 Add-Type 中调用的程序集在 .NET 4.5 之前并不存在,这可以解释原始发布者的错误,这就是我向 OP 查询它的原因。
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多