在Powershell中使用io.compression.zip文件进行异构处理

时间:2017-01-24 18:06:56

标签: windows powershell command-line compression

我正在使用powershell脚本来自动归档目录及其子目录。我正在使用一个非常简单的

    Add-Type -AssemblyName "system.io.compression.filesystem"
    [io.compression.zipfile]::CreateFromDirectory($d, $destinationFilename)

在大多数情况下,这正是我正在做的事情;但最近空子目录存在问题。这些空的子目录以某种方式被压缩为文件而不是目录。

  1. 首先,还有其他人遇到过这个吗?
  2. 问题与此.Net API有关,还是存在环境问题?
  3. 我应该使用:: CreateFromDirectory函数的不同版本吗?
  4. 感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我正在使用Bryan的这个脚本,它做了它所说的,它也应该满足你的要求。

您可以使用许多参数,如压缩类型,时间戳,确认

# Purpose: Creates a .zip file of a file or folder.
#
# Sample: zipstuff.ps1 -target "C:\Projects\wsubi" -zip_to "C:\Users\Bryan\Desktop\wsubi" [-compression fast] [-timestamp] [-confirm]
#
# 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");
}

<强>用法:

zipstuff.ps1 -target "C:\Projects\wsubi" -zip_to "C:\Users\Bryan\Desktop\wsubi" [-compression fast] [-timestamp] [-confirm]

希望它有所帮助。