使用 Azure PowerShell 轻松处理 Azure Blob 存储中的 0 字节文件
简介
您是否曾经觉得自己面临着需要很长时间才能解决的挑战?最近,当我不得不在 Azure Blob 存储中追踪损坏的文件时,我就有了这种感觉。幸运的是,在 Azure 的一些 PowerShell 脚本的帮助下,我能够轻松地跟踪和修复文件,在我的例子中删除它们。
如果这对您来说听起来很熟悉,并且如果您正在寻找批量处理文件的分步计划,那么您来对地方了。在本文中,我将简要讨论文件是如何损坏的。然后,我将介绍我用来查找文件的手动方法。最后,我将介绍一个逐步计划的 PowerShell 脚本来查找和删除 0 字节文件。
问题原因:内存不足
有问题的应用程序是一个数字体验平台 (Kentico Xperience),它由典型的 Azure 组件组成,例如用于存储媒体文件的 Azure Web 应用程序、Azure SQL 数据库和 Azure Blob 存储。每晚通过计划任务与产品信息管理系统同步,从而更新包括图像在内的最新产品数据并将其存储在 Azure Blob 存储中。同步进行得很顺利,直到某个时候出现错误消息:Exception type: System.OutOfMemoryException
。
同步失败与损坏的图像没有直接联系。直到有报道称网站上的图像随机丢失后,才清楚地知道还有更多事情发生。调试图像处理器显示,由于内存异常,缩略图生成为 0 字节图像,分布在数十个文件夹😱。
由于只同步更新的产品,因此搜索损坏的缩略图就像大海捞针一样。
手动查找和删除损坏图像的方法
在搜索 0 字节文件时,我在 Azure Web 应用程序上遇到了 Azure 临时和 Azure 缓存文件夹。应用程序使用这些文件夹来存储来自 Azure Blob 存储的临时数据。通过可用于 Azure Web Apps 的服务Kudu Console,可以使用命令提示符浏览这些文件夹。通过执行以下命令行脚本,将搜索所有 0 字节文件并将其写入 txt 文件:
forfiles /S /M *.* /C "cmd /c if @fsize EQU 0 (if @isdir EQU FALSE echo @path)" > list.txt
进入全屏模式 退出全屏模式
来源:如何在 Windows 和 Linux 中查找并列出零字节文件
现在我们有了损坏文件的列表,我们可以在 Azure Blob 存储媒体容器中追踪它们。为此,我强烈推荐Microsoft Azure Storage Explorer💯。
如果您只需要浏览合理数量的文件和文件夹,这种方法就可以正常工作。就我而言,它涉及更多文件夹中的数十个文件。这就是为什么我要寻找一种方法来一次搜索和删除所有 0 字节文件。 Azure PowerShell 助您一臂之力!
Azure PowerShell 分步指南查找和删除 0 字节文件
本指南基于 Azure PowerShell 命令。有关详细信息,请查看如何安装 Azure Az PowerShell 模块。这些步骤由 Azure PowerShell 命令组成,用于:
-
访问 Azure 订阅
-
指定Azure存储账户
-
执行搜索命令查找文件
-
使用删除指令扩展搜索命令
在以下步骤中,我们需要从 Azure 提供一些数据。建议检查您是否具有通过 Azure PowerShell 访问上述 Azure 资源所需的权限。
注意:我建议先在测试环境中广泛测试脚本,然后再投入生产。
第 1 步:连接到您的 Azure 帐户
您可以选择通过传入-TenantId
参数来指定所需的 Azure 租户。有关详细信息,请参阅文档。
Connect-AzAccount
进入全屏模式 退出全屏模式
步骤 2:创建 Azure 存储上下文
接下来,我们将指示我们要定位的 Azure Blob 存储。这可以使用Azure 存储上下文来完成。由于我们在接下来的步骤中需要上下文,我们将 Azure 存储上下文存储在$Context
变量中。
$Context = New-AzStorageContext -StorageAccountName "< Account Name >" -StorageAccountKey "< Storage Key ends with == >"
进入全屏模式 退出全屏模式
第 3 步:搜索文件
使用上一步中存储的 Azure 存储上下文,我们可以从所需的 Azure 容器中检索文件。通过使用Where-Object管道扩展Get-AzStorageBlob命令,我们可以准确指定我们需要的内容,即所有 0 字节文件。
Get-AzStorageBlob -Context $Context -Container "< Container Name >" | Where-Object {$_.Length -eq 0}
进入全屏模式 退出全屏模式
您可以通过另外传入内容类型来扩展 where 条件以仅过滤图像(jpg):
Get-AzStorageBlob -Context $Context -Container "< Container Name >" | Where-Object {$_.Length -eq 0 -and $_.ContentType -eq "image/jpeg"}
进入全屏模式 退出全屏模式
第 4 步:删除 0 字节文件
如果您已找到损坏的图像,删除它们应该非常简单。您只需在上一步的命令末尾添加Remove-AzStorageBlob管道即可:
Get-AzStorageBlob -Context $Context -Container "< Container Name >" | Where-Object {$_.Length -eq 0} | Remove-AzStorageBlob
进入全屏模式 退出全屏模式
在附加 jpg 图像内容类型过滤器的情况下:
Get-AzStorageBlob -Context $Context -Container "< Container Name >" | Where-Object {$_.Length -eq 0 -and $_.ContentType -eq "image/jpeg"} | Remove-AzStorageBlob
进入全屏模式 退出全屏模式
这样,您就拥有了查找损坏文件并批量删除它们所需的所有脚本😊。
结论
在本文中,我分享了解决我所面临的由于 Azure Web 应用程序的内存问题而导致图像损坏的问题的方法。在文章的第一部分,我提供了一个解决方案,通过 Kudu Console 和 Microsoft Azure Storage Explorer 的联合力量手动检测和删除损坏的文件。因为在我的案例中涉及大量文件,所以我还提供了包含 Azure PowerShell 命令的分步指南,用于搜索相关文件并一次性删除它们。
最后我希望您不要遇到这些情况,并且您的应用程序继续顺利运行。在所有其他情况下,我希望这篇文章对您有所帮助。
感谢您的阅读!
更多推荐
所有评论(0)