我正在运行一个 PowerShell 函数应用程序 (~3
),它使用 Az
PowerShell 模块来管理存储帐户。如果我执行的任何操作导致错误,我将无法在 try
/catch
block 中检查特定类型。
请务必注意,如果没有错误,则使用 Az.Storage
模块的操作会成功。
例如,如果我尝试删除一个不存在的容器,下面的示例会导致以下错误 -
Unable to find type [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException].
为了获取返回的异常类型,我使用了 $_.Exception.GetType().fullname
。
我还尝试将命名空间添加到可能产生异常的脚本中。
using namespace Microsoft.WindowsAzure.Commands.Storage.Common
例子
Class Storage
{
[AppSettings]$AppSettings = [AppSettings]::GetInstance()
[Object]$Context
Storage()
{
$key = Get-AzStorageAccountKey -ResourceGroupName $this.AppSettings.StorageAccountResourceGroup -Name $this.AppSettings.StorageAccountName
$this.Context = New-AzStorageContext -StorageAccountName $this.AppSettings.StorageAccountName -StorageAccountKey $key[0].Value
}
[void] DeleteBlobContainer([String]$name)
{
try {
Remove-AzStorageContainer -Name $name -Context $this.Context -Force -ErrorAction Stop
}
catch [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException] {
throw [ContainerNotFoundException]::new($name)
}
catch {
throw [DustBinException]::new($_.Exception.Message)
}
}
}
更新
调用 HTTP 触发函数时,我可以看到安装了 Az.Storage
模块。这是预期的,因为需要该模块的操作是成功的 -
Get-Module -Name Az.Storage -ListAvailable | Select-Object Name, Version, ModuleBase | ConvertTo-Json
[
{
"Name": "Az.Storage",
"Version": {
"Major": 3,
"Minor": 0,
"Build": 0,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"ModuleBase": "C:\\Users\\dgard\\AppData\\Local\\AzureFunctions\\DustBin\\ManagedDependencies\\201202095548376.r\\Az.Storage\\3.0.0"
}
]
但是,如果将模块复制到 .\bin 并包含模块 list 以要求 Microsoft.Azure.Storage.Common.dll,如 this question 中的建议, 仍然找不到类型。
New-ModuleManifest ./Modules/StorageHelper/StorageHelper.psd1 -RootModule StorageHelper.psm1 -RequiredAssemblies .\bin\Az.Storage\3.0.0\Microsoft.Azure.Storage.Common.dll
为确保我添加了正确的程序集,我更新了 list 以将每个程序集都包含在 Az.Storage
模块中,但仍未找到该类型。
最佳答案
在我的问题中,我添加了一个更新,提到我曾尝试添加一个需要所有 Az.Storage
程序集的模块 list ;这不太正确...
我从 Az.Storage
模块随附的模块 list 中复制了所需程序集的列表,但这不包括 Microsoft.Azure.PowerShell.Cmdlets.Storage.dll
。使用模块 list 要求此程序集(仅此一个,不需要其他程序集)已奏效。
New-ModuleManifest ./Modules/StorageHelper/StorageHelper.psd1 -RootModule StorageHelper.psm1 -RequiredAssemblies .\bin\Az.Storage\3.0.0\Microsoft.Azure.PowerShell.Cmdlets.Storage.dll
关于PowerShell 无法在 try/catch block 中找到异常类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65128669/