我以前从未使用过 Powershell。经过一些研究后,我编写了一个压缩文件夹的脚本。
我想确保我可以捕获执行期间生成的任何错误,因此我添加了一个 Try Catch block ,并尝试记录所有错误。我需要确保压缩过程成功。
此脚本假设我们可以添加到现有的 zip 文件(如果它已经存在)。稍后我将添加一个检查以删除以前的 zip 文件,但现在如果我保持原样以测试日志记录,因为它会生成错误。
但是,错误没有按预期捕获和记录。关于我做错了什么有什么建议吗?错误是弹出窗口“此文件夹已包含名为“Backups”的文件夹。重命名您要复制的文件夹,然后再次执行该操作。
########################################################
#
# 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
最佳答案
您看到的弹出窗口是由 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并且也不能真正扩展大量文件(另一点是代码中的 sleep )
请使用一些命令行压缩工具(例如 7z.exe)进行压缩。
关于powershell - 在 Powershell 中压缩文件夹时捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274021/