Эффективное сжатие архивов в Powershell как фоновый процесс - PullRequest
0 голосов
/ 07 октября 2019

У меня есть скрипт powershell, выполняющийся в сеансе PowerShell, который прослушивает файлы в каталоге. Когда пользователь помещает подкаталог или файл в прослушиваемую папку ('toZip'), powershell вызывает 7Zip4PowerShell: https://www.powershellgallery.com/packages/7Zip4Powershell/1.9.0 и создает файл .zip в папке zipOut. Затем исходный файл перемещается в папку «toDelete», и пользователь может проверить данные на следующий день, переместить файл .zip с сервера и удалить их несжатые данные.

Проблема заключается в том, что этот PowerShellВремя ожидания сценария / или сеанса истекает через несколько дней. Если мне нужно сжать несколько подкаталогов размером 1 ТБ, это приведет к превышению времени ожидания во втором или третьем подкаталоге, и нет никакого способа узнать это, если не очевидно, что очередь больше не движется.

Я продублировал этот скриптдля 4 мест, потому что это был самый простой способ для меня, и я проверил сценарий. В течение нескольких дней все работает нормально (требуется 1 день, чтобы сжать 1 ТБ в один файл), но затем через некоторое время программа зависает и продолжает работать в диспетчере задач, хотя ничто не вносит свой вклад в неполный .zipфайл в этой точке. Я не уверен, что существует определенный тип файлов, вызывающий проблему, но если я вручную запустил 7zip для данного файла, я смогу сжать очень хорошо.

$folder3 = 'H:\Shares\Data3\toZip'
$filter3 = '*.*'                             
$destinationZip3 = 'H:\Shares\Data3\ZipOut'
$destinationDelete3 = 'H:\Shares\Data3\toDelete'
$logPath3 = 'H:\Shares'
$fsw3 = New-Object IO.FileSystemWatcher $folder3, $filter3 -Property @{
 IncludeSubdirectories = $false              
 NotifyFilter = [IO.NotifyFilters]'FileName, DirectoryName, LastWrite'
}
$onCreated3 = Register-ObjectEvent $fsw3 Created -SourceIdentifier FileHZipped -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 $baseName = [System.IO.Path]::GetFileNameWithoutExtension($name)
Write-Host “The base name is ‘$baseName’ ”
 $changeType = $Event.SourceEventArgs.ChangeType
 $timeStamp = $Event.TimeGenerated
 Write-Host "The file '$name' was $changeType at $timeStamp" –fore green
 Compress-7Zip -Path $path -ArchiveFileName "$($destinationZip3)\$($baseName).zip" -Format Zip
 Write-Host “The file ‘$($destinationZip3)\$($name)’ was zipped at $timeStamp”
 Out-File –FilePath “$($logPath3)\logZip.txt” –Append –InputObject “The file ‘$($destinationZip3)\$($baseName)’ was zipped at $timeStamp”
 Move-Item $path -Destination $destinationDelete3 -Force -Verbose # Force will overwrite files with same name
}

Меньшие файлы zip отлично иданные перемещаются в соответствующие папки. Просто большие подкаталоги вызывают тайм-аут программы. Я не уверен, какие ресурсы я должен получить доступ для дальнейшей отладки этой проблемы. Будем весьма благодарны за любые ссылки или ссылки на соответствующую документацию.

...