在Powershell中压缩文件夹时捕获错误

时间:2011-11-25 20:40:44

标签: powershell zip try-catch

我之前从未做过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 个答案:

答案 0 :(得分:3)

您看到的弹出窗口是由Shell生成的。虽然you can suppress the UI by passing the flag 1024,但我不认为可以将其作为可以在Powershell中捕获的错误来处理,因为Shell不会将其返回到Powershell。您必须明确处理案例而不是捕获错误。

此外,it is generally accepted that this way of zipping files is not really very flexible并且也无法真正扩展大量文件(另一点是您的代码中的睡眠)

请使用一些命令行压缩工具,如7z.exe进行压缩。