我之前从未做过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
答案 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进行压缩。