Обработка ошибок Azure Powershell - конкретные ошибки и ответы - PullRequest
0 голосов
/ 22 октября 2018

Попытка настроить что-то в PowerShell, которое в конечном итоге перейдет на автоматизацию Azure.В частности, при попытке добавить новую запись DNS с помощью следующей команды:

$Hostname = "testhostname"
$Zone = "subdomain.domain.com"
$IP = "1.2.3.4"
$RG = "testresourcegroup"

New-AzureRMDNSRecordSet -Name "$Hostname" -RecordType A -ZoneName $Zone -ResourceGroupName $RG -ttl 3600 -DnsRecords (New-AzureRMDNSRecordConfig -IPv4address "$IP") -ErrorAction Stop

Команда вернет одно из следующего:

1) Если запись уже существует:

New-AzureRMDNSRecordSet : The Record set testhostname exists already and hence cannot be created again.
At line:1 char:1
+ New-AzureRMDNSRecordSet -Name "$Hostname" -RecordType A -ZoneName $Zo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : CloseError: (:) [New-AzureRmDnsRecordSet], CloudException
 + FullyQualifiedErrorId : Microsoft.Azure.Commands.Dns.NewAzureDnsRecordSet

2) Если IP-адрес недействителен:

New-AzureRMDNSRecordSet : The provided ip address '3333.4.21.11' is not valid.
At line:1 char:1
+ New-AzureRMDNSRecordSet -Name "$Hostname" -RecordType A -ZoneName $Zo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : CloseError: (:) [New-AzureRmDnsRecordSet], CloudException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Dns.NewAzureDnsRecordSet

3) Успешно:

Id                : /subscriptions/(subscriptionID)/resourceGroups/testresourcegroup/providers/Microsoft.Network/dnszones/subdomain.domain.com/A/testhostname
Name              : testhostname
ZoneName          : subdomain.domain.com
ResourceGroupName : testresourcegroup
Ttl               : 3600
Etag              : (removed)
RecordType        : A
TargetResourceId  :
Records           : {1.2.3.4}
Metadata          :
ProvisioningState : Succeeded

Я пытаюсь получить ошибки, используя "try"«поймать», но не удалось.Вот что я попробовал:

try {
    New-AzureRMDNSRecordSet -Name "$Hostname" -RecordType A -ZoneName $Zone -ResourceGroupName $RG -ttl 3600 -DnsRecords (New-AzureRMDNSRecordConfig -IPv4address "$IP") -ErrorAction Stop #-ErrorVariable badIP -ErrorAction SilentlyContinue | Out-null
}
catch {
    Write-Host "There was an error"
}

Я хотел бы получить его там, где на основании ошибки RESPONSE я могу напечатать конкретный вывод.Пример, первая ошибка: «Набор записей $ Hostname уже существует и, следовательно, не может быть создан снова».Я хотел бы иметь возможность принять это, и вместо этого, просто вывести пользователю: «Дублировать имя хоста; пожалуйста, попробуйте другой».

Я борюсь с тем, как поместить конкретные ошибки в «catch»

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

В коде powershell есть проблема.Для string вы должны использовать .Contains() вместо -contains.

У меня не было вашей среды, поэтому я просто пишу аналогичный код для обработки ошибок:

try
{
Copy-Item -Path d:\t2.txt -Destination d:\333\ -ErrorAction Stop
}
catch
{

$message = $_.Exception.message

if($message.Contains("Cannot find path"))
{
Write-Output "the source path is not correct"
}

if($message.Contains("The filename, directory name"))
{
Write-Output "the destination path is not correct"
}

}

И результат теста следующий: enter image description here

Так что для вашего случая сценарии должны выглядеть следующим образом:

try 
{ 
New-AzureRMDNSRecordSet -Name "$Hostname" -RecordType A -ZoneName $Zone -ResourceGroupName $RG -ttl 3600 -DnsRecords (New-AzureRMDNSRecordConfig -IPv4address "$IP") -ErrorAction Stop  
} 

catch 
{ 

if ($_.Exception.Message.Contains("The provided IP address $IP is invalid"))
{ Write-Output "The IP is invalid" } 

if ($_.Exception.Message.Contains("exists already and hence"))
{ Write-Output "The hostname is duplicated; please pick another" } 

}
0 голосов
/ 22 октября 2018

Вы можете использовать синтаксис

try {
}
catch [YourExceptionType.. e.g. Microsoft.Rest.Azure.CloudException]
{
}

или использовать

$_.Exception

внутри блока catch.

Вы можете даже иметь несколько блоков catch.Точный синтаксис описан в следующем about_page:

get-help about_try_catch_finally -ShowWindow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...