Функция zip в Powershell v2 - это не все - PullRequest
0 голосов
/ 26 сентября 2018

Я не могу вспомнить, где я нашел ответ, который привел меня к использованию этого фрагмента Powershell, но я использовал этот сценарий для архивирования папки и содержащихся в ней файлов:

param (
[string]$ZipFrom,
[string]$ZipTo
)
function Add-Zip
{
    param([string]$zipfilename)

    if(-not (test-path($zipfilename)))
    {
        set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
    (dir $zipfilename).IsReadOnly = $false  
    }

    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfilename)

    foreach($file in $input) 
    { 
        $zipPackage.CopyHere($file.FullName)
        Start-sleep -milliseconds 500
    }
}

If(Test-path $ZipTo) {Remove-item $ZipTo}

dir $ZipFrom -Recurse | Add-Zip $ZipTo

Не уверен, что мне не хватает, но кажется, что это архивация файлов в папке.Я только что попробовал это на папке с 62 файлами в ней, и я закончил с zip-архивом с 31 файлом в нем.

1 Ответ

0 голосов
/ 23 апреля 2019

Вы столкнулись с той же проблемой, которую другие заметили при использовании команды Shell.Application CopyHere().Он асинхронный (неблокирующий) и не сообщает о завершенных событиях.

Добавление Sleep() не будет надежно работать для больших файлов, поскольку объект Shell.Application будет удален и отсоединен от дочерних потоков до того, как они завершатся.

Попробуйте повторно проверить наличие файла назначения, как в связанном ответе.Надеюсь это поможет!

...