Назад | Перейти на главную страницу

Скрипт Powershell для архивирования файлов

Я новичок в Powershell. У меня есть потребность, для которой я считал, что она идеально подходит. Тем не менее, я быстро дошел до того, что чувствую, что нахожусь над своей головой. По сути, мне нужно создать файл .zip.

У меня есть каталог, который выглядит следующим образом:

MyStuff
  Dir1
    Child1
      File1.txt
    Child2
      File1.png
    Child3
      File1.txt
  Dir2
    File1.txt
  File1.txt
  File2.txt
  File3.txt
  ...

Мне нужно создать файл .zip с именем bundle.zip. Bundle.zip НЕ должен содержать все файлы внутри MyStuff. Вместо этого мне нужно включить MyStuff / File1.txt, MyStuff / File2.txt, MyStuff / File3.txt и MyStuff / Dir1 / * в файл .zip. Я понятия не имею, как это сделать с помощью PowerShell.

На моем компьютере установлен PowerShell v1.0. Я пробовал «Write-Zip» из расширений сообщества PowerShell, однако я получаю сообщение об ошибке: «Термин« Write-Zip »не распознается как имя командлета, функции, файла сценария или рабочего программа ».

Что я делаю не так?

Архивирование можно выполнить с помощью CreateFromDirectory метод класса .NET System.IO.Compression.ZipFile. Я предпочитаю использовать .NET, а не устанавливать расширения сообщества и другие надстройки, чтобы сохранить среду сервера как можно более чистой.

Я считаю, что вы не можете использовать его для добавления в zip-архив, но вам нужно будет временно скопировать файлы и папки с правильной структурой в промежуточный каталог. Оттуда вы можете создать zip-файл и удалить промежуточное содержимое.

Чтобы использовать .NET для архивирования, вам сначала нужно загрузить сборку класса:

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

Затем вы можете вызвать класс:

[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)

Куда:

$DirPath это каталог, который вы хотите заархивировать.

$ZipFilePath это имя zip-файла, который вы хотите создать.

$Compressionlevel можно установить на Optimal, Fastest или NoCompression.

$includeBaseDir возможно $true или $false.

Я написал из него функцию, чтобы избавить меня от необходимости искать Справочная страница .NET все время. Если вы посмотрите на страницу, вы увидите, что есть способ разархивирования.

Требуется .NET 4.5, и я настоятельно рекомендую вам также обновить PowerShell. Каждая версия принесла огромные улучшения. Кроме того, оказалось, что использование .NET является эффективным, поскольку сравнив его с популярными сторонними zip-приложениями, он показал хорошие результаты.

Функция довольно понятна, просто убедитесь, что вы запустили саму функцию перед ее вызовом. Вот краткое изложение синтаксиса, если оно вам нужно:

New-ZipFile {DirToZip} {ZipfilePathAndName} {fastORoptimalORnocompression} {IncludeBaseDirectoryInZip($true or $false)}

Так что застегнуть E:\stuff к D:\zipfile.zip используя оптимальное сжатие и включить .\stuff в zip-файле вы должны запустить:

New-ZipFile 'E:\stuff' 'D:\zipfile.zip' Optimal $true

Вот функция:

#region function New-ZipFile
<#
.Synopsis
   Creates a zip file from a directory.
.DESCRIPTION
   Creates a zip file from a directory. Options include compression level and wether or not to include the base directory. Class reference: https://msdn.microsoft.com/en-us/library/hh875104(v=vs.110).aspx
.EXAMPLE
   New-ZipFile c:\dir c:\zipfile.zip Fastest $True
.EXAMPLE
   New-ZipFile c:\dir c:\zipfile.zip Optimal $True
.INPUTS
   Inputs to this cmdlet (if any)
.OUTPUTS
   Output from this cmdlet (if any)
.NOTES
   General notes
.COMPONENT
   The component this cmdlet belongs to
.ROLE
   The role this cmdlet belongs to
.FUNCTIONALITY
   The functionality that best describes this cmdlet
#>
function New-ZipFile
{
    Param
    (
        # The directory to zip.
        [Parameter(Mandatory=$true, 
                   Position=0)]
        [ValidateNotNullOrEmpty()]
        [string]$DirPath,

        # The zipfile name.
        [Parameter(Mandatory=$true, 
                   Position=1)]
        [ValidateNotNullOrEmpty()]
        [string]$ZipFilePath,

        # Specifies values that indicate whether a compression operation emphasizes speed or compression size.
        [Parameter(Mandatory=$true, 
                   Position=2)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet("Fastest", "NoCompression", "Optimal", ignorecase=$True)]
        [string]$CompressionLevel,

        # $True to include the directory name from sourceDirectoryName at the root of the archive; $False to include only the contents of the directory.
        [Parameter(Mandatory=$true, 
                   Position=3)]
        [ValidateNotNullOrEmpty()]
        [bool]$includeBaseDir
          )

    #Load the .NET 4.5 zip-assembly
    [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
    # Zip the directory.
    [System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
}
#endregion

РЕДАКТИРОВАТЬ: парень по сценариям написал статью, в которой показывает альтернативный способ загрузки сборки, это немного чище.

Вам необходимо загрузить расширение сообщества Powershell, совместимое с вашей установленной версией Powershell, и установить его. После завершения установки вам нужно переместить модуль PSCX из папки Program files в модуль Powershell, а затем попробовать использовать команду Write-Zip.

https://pscx.codeplex.com/releases/view/133199