Powershell aguarde a compactação terminar

2

Eu escrevi um script do PowerShell que fecha o conteúdo de uma pasta e a envia para um servidor para backup. A questão é que o processo de cópia não espera que o processo de zip seja concluído. Eu tentei usar Out-Null e Wait-Process e nada parece estar funcionando. Out-Null simplesmente não faz nada, e Wait-Process me diz que não existe tal processo. Eu não consigo descobrir o nome do processo para a compactação do Windows. Qualquer ajuda seria muito apreciada. Abaixo está a parte do código que gostaria de ter pausado até terminar.

function out-zip { 
Param([string]$path) 

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 
$ZipFile = (new-object -com shell.application).NameSpace($path) 
$input | foreach {$zipfile.CopyHere($_.fullname)} 
} 
gi "C:\File-Backups\Share1" | out-zip C:\File-Backups\transfer\PC1-Backup 

    
por Patrick 14.11.2012 / 19:19

2 respostas

6

Tem certeza de que o código comprime os arquivos em um formato zip válido? Não parece que faça algo útil para mim. (edição: Ah, é? Legal!)

De qualquer forma, para responder à sua pergunta, o Out-Null não faz nada porque é Out-Null ... e o Wait-Process não faz nada porque você não está executando um processo.

O que você quer é o Jobs da Powershell.

Start-Job

link

Wait-Job

link

edit 2: Além disso, parece que você está usando o Powershell v3!

[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$src_folder = "D:\stuff"
$destfile = "D:\stuff.zip"
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$includebasedir = $false
[System.IO.Compression.ZipFile]::CreateFromDirectory($src_folder,$destfile,$compressionLevel, $includebasedir )

Coloque um foreach em torno da última linha lá, conforme apropriado, para compactar cada um dos seus arquivos, ou o que você quiser, então envolva a coisa toda como entrada para um Start-Job.

    
por 14.11.2012 / 19:55
3

O processo que faz a compactação é o Explorer, o shell do Windows (assim, você não pode esperar que o processo seja encerrado porque ele sempre é executado).

Aqui está uma postagem de blog com algum código que estende seu exemplo e usa testes de bloqueio de arquivo para determinar quando a compactação é concluída:

link

Caso contrário, você está pensando em usar alguma biblioteca zip externa para o PowerShell que não use o explorer, ou chamar um programa como o cliente da linha de comando 7-Zip para fazer o trabalho e esperar que isso termine.

    
por 14.11.2012 / 20:53