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)
因此,我可以从 Az Cli 捕获正确的错误,并且为了避免为每个 az 命令添加额外的行,我创建了自己的az-ps函数来包装所有 az 调用:
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}\nRun Code Online (Sandbox Code Playgroud)\n然后我只是调用它而不是az- 例如:
$databases = az-ps sql midb list --resource-group myResourceGroup --managed-instance myManagedSqlInstance\nRun Code Online (Sandbox Code Playgroud)\n如果这返回错误,您会得到:
\nWrite-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.\nRun Code Online (Sandbox Code Playgroud)\n这是做什么的:
\n它传递所有$argstoaz所以它应该接受 az 所做的任何参数
该2>&1参数意味着错误输出 (2) 将被重定向到正常输出 (1) - 因此,如果成功,$result则将包含调用的输出,如果失败,则将包含错误消息。az
$?true是一个特殊的 powershell var,如果最后一个命令成功则包含,false如果失败则包含
-ErrorAction Stop将阻止 powershell 脚本继续(除非有 try/catch 块)
在常规 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)
| 归档时间: |
|
| 查看次数: |
13629 次 |
| 最近记录: |