Script Powershell para arquivos zip

2

Sou novo no Powershell. Eu tenho uma necessidade que eu assumi que seria perfeito para. No entanto, eu rapidamente cheguei ao ponto em que sinto que estou na minha cabeça. Basicamente, eu preciso criar um arquivo .zip.

Eu tenho um diretório parecido com o seguinte:

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

Eu preciso criar um arquivo .zip chamado bundle.zip. Bundle.zip não deve ter todos os arquivos dentro do MyStuff. Em vez disso, preciso incluir MyStuff / File1.txt, MyStuff / File2.txt, MyStuff / File3.txt e MyStuff / Dir1 / * no arquivo .zip. Não tenho ideia de como fazer isso com o PowerShell.

Eu tenho o PowerShell v1.0 instalado na minha máquina. Eu tenho tentado "Write-Zip" a partir do PowerShell Community Extensions, no entanto, recebo um erro que diz: "O termo 'Write-Zip' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou operável programa".

O que estou fazendo de errado?

    
por user26712 30.07.2013 / 20:34

2 respostas

1

Você precisa baixar o Powershell Community Extension compatível com a versão do Powershell instalada e instalar o mesmo. Depois que a instalação estiver concluída, é necessário mover o módulo PSCX do local dos arquivos de programa para o Powershell Module e, em seguida, tentar usar o comando Write-Zip.

link

    
por 14.08.2015 / 09:27
1

A compactação pode ser feita usando o método CreateFromDirectory da classe .NET System.IO.Compression.ZipFile . Eu prefiro usar o .NET sobre a instalação de extensões da comunidade e outros add-ons, a fim de manter o ambiente do servidor o mais limpo possível.

Eu acredito que você não pode usá-lo para adicionar a um arquivo zip, mas precisaria copiar temporariamente os arquivos e pastas na estrutura correta para um diretório temporário. A partir daí, você pode criar o arquivo zip e excluir o conteúdo de teste.

Para usar o .NET para compactação, primeiro é necessário carregar o assembly de classe:

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

Depois, você pode ligar para a turma:

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

Onde:

$DirPath é o diretório que você deseja zipar.

$ZipFilePath é o nome do arquivo zip que você deseja criar.

$Compressionlevel pode ser definido como Optimal , Fastest ou NoCompression .

$includeBaseDir pode ser $true ou $false .

Eu escrevi uma função para me poupar o incômodo de ter que procurar o página de referência do .net o tempo todo. Se você olhar a página, verá que há um método para descompactar também.

O .NET 4.5 é necessário e eu recomendo strongmente que você também atualize o powershell. Todas as versões trouxeram melhorias massivas. Acontece que usar o .NET é eficiente, tendo comparado com os aplicativos zip de terceiros populares que ele sai com força.

A função é bem autoexplicativa, apenas certifique-se de executar a função antes de chamá-la. Aqui está um breve resumo da sintaxe se você precisar:

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

Então para compactar E:\stuff para D:\zipfile.zip usando compactação ideal e incluir o baseir .\stuff no arquivo zip, você executaria:

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

Aqui está a função:

#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

EDIT: O cara do Scripting escreveu um artigo onde ele mostra um maneira alternativa de carregar o assembly , é um pouco mais limpo.

    
por 14.08.2015 / 09:42