Azure CLI 异常处理

Rak*_*dav 14 powershell command-line-interface azure

我已在本地系统上安装了 azure cli,并且可以在 Windows Powershell 中运行 azure cli 命令。当我运行任何不正确的命令或引发任何异常时,我可以在控制台上看到它。但是如何使用 Try...Catch 捕获此异常。我想在 powershell 脚本中使用 try..catch 处理异常。

请帮我解决这个问题。

代码片段:

假设我的 ClientSecret 错误,那么下面的命令将出现异常,我如何在 Catch 块中捕获此异常?

 Try
    {

     $TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' 
     $ClientId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' 
     $ClientSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

     az login --service-principal -u $ClientId -p $ClientSecret --tenant $TenantId 

    }
    Catch 
    {
        $ErrorMessage = $_.Exception.Message
        Write-Output $ErrorMessage 
    }
Run Code Online (Sandbox Code Playgroud)

这是问题的快照

ElG*_*ngo 6

因此,我可以从 Az Cli 捕获正确的错误,并且为了避免为每个 az 命令添加额外的行,我创建了自己的az-ps函数来包装所有 az 调用:

\n
function az-ps {\n    $result = az $args 2>&1\n    if(!$?) { Write-Error -Message "az $args returned error $result" -ErrorAction Stop }\n    return $result\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后我只是调用它而不是az- 例如:

\n
$databases = az-ps sql midb list --resource-group myResourceGroup --managed-instance myManagedSqlInstance\n
Run Code Online (Sandbox Code Playgroud)\n

如果这返回错误,您会得到:

\n
Write-Error: az_error_test.ps1:11\nLine |\n  11 |  \xe2\x80\xa6 databases = az-ps sql midb list --resource-group myResourceGroup  --manage \xe2\x80\xa6\n     |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n     | az sql midb list --resource-group myResourceGroup --managed-instance\n     | myManagedSqlInstance returned error ERROR: (ParentResourceNotFound) Can not perform requested operation\n     | on nested resource. Parent resource 'myManagedSqlInstance' not found. Code: ParentResourceNotFound\n     | Message: Can not perform requested operation on nested resource. Parent resource 'myManagedSqlInstance'\n     | not found.\n
Run Code Online (Sandbox Code Playgroud)\n

这是做什么的:

\n

它传递所有$argstoaz所以它应该接受 az 所做的任何参数

\n

2>&1参数意味着错误输出 (2) 将被重定向到正常输出 (1) - 因此,如果成功,$result则将包含调用的输出,如果失败,则将包含错误消息。az

\n

$?true是一个特殊的 powershell var,如果最后一个命令成功则包含,false如果失败则包含

\n

-ErrorAction Stop将阻止 powershell 脚本继续(除非有 try/catch 块)

\n


Avs*_*lom 1

在常规 Powershell 命令中,您可以使用 CommonParameter-ErrorAction Stop但对于 AzureCli az 命令,我认为您可以使用简单的 if 语句:

if (az login --service-principal -u $ClientId -p $ClientSecret --tenant $TenantId)
{
   "Success"
}
     else {"Error"}
Run Code Online (Sandbox Code Playgroud)

$?或者在尝试登录后使用“自动”变量检查最后的退出状态:

if (!$?) {"Error"}
Run Code Online (Sandbox Code Playgroud)