Поймать ошибку при архивировании папки в Powershell - PullRequest
2 голосов
/ 26 ноября 2011

Я никогда не делал Powershell раньше.После некоторого исследования я написал скрипт, который архивирует папку.

Я хочу убедиться, что могу зафиксировать любую ошибку, сгенерированную во время выполнения, поэтому я добавил блок Try Catch и пытаюсь записать все ошибки.Мне нужно убедиться, что процесс архивирования прошел успешно.

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

Однако ошибка не обнаружена и не зарегистрирована, как ожидалось.Любые предложения относительно того, что я делаю не так?Во всплывающем окне появляется сообщение об ошибке: «Эта папка уже содержит папку с именем« Резервные копии ». Переименуйте папку, которую вы пытаетесь скопировать, а затем снова выполните операцию.

########################################################
#
# Zip-Folder.ps1
#
# Usage:
# To zip up a folder:
# (Zip Application) (Target Archive path and File Name) (Source Folder Path to Backup)     (Log Path and File Name)
# d:\zip-folder.ps1 d:\Backups_Archive d:\Backups
########################################################

try{
$target = $args[0]
$files = Get-item $args[1]
$log = $args[2]


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

if (-not (test-Path $target)) { 
  set-content $target ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($target) 
# $files | foreach {$zipfile.CopyHere($_.fullname)} 

foreach($file in $files) 
    { 
        $zipfile.CopyHere($file.FullName)
            Start-sleep -milliseconds 500
    }
} catch {
    Add-Content $log $error[0]

}

Для выполнения: (Zip-приложение)(Целевой путь к архиву и имя файла) (Путь к исходной папке для резервного копирования) (Путь к журналу и имя файла) Например, d: \ zip-folder.ps1 d: \ Backups_Archive d: \ Backups d: \ zip.log

1 Ответ

3 голосов
/ 26 ноября 2011

Всплывающее окно, которое вы видите, генерируется оболочкой.Хотя вы можете подавить пользовательский интерфейс, передав флаг 1024, я не думаю, что это можно обработать как ошибку, которая может быть обнаружена в Powershell, поскольку оболочка не возвращает егоPowershell.Вам придется обрабатывать случай явно, а не перехватывать ошибку.

Кроме того, общепринято, что этот способ архивации файлов не очень гибок и также не масштабируется сбольшое количество файлов (другой момент - это сон, который есть в вашем коде)

Пожалуйста, используйте какой-нибудь инструмент командной строки для архивирования, например, 7z.exe, для архивирования.

...