служба обновления az-конечные точки с использованием переменной

#azure #service #command-line-interface #endpoint

Вопрос:

Я пытаюсь добавить несколько конечных точек обслуживания в подсети, используя команду update, и имея переменную для представления SE

Когда он запускается, он завершается с ошибкой и сообщением о том, что массив использует недопустимое имя службы.

При выполнении команды без переменной для SE она выполняется без каких-либо проблем.

 $SE = "Microsoft.KeyVault Microsoft.Storage"

az network vnet subnet update --service-endpoints $SE --resource-group MyRg1 --vnet-name MyVnet --name MySnet

## Used to display the varaible format
Write-host "az network vnet subnet update --service-endpoints $SE --resource-group MyRg1 --vnet-name MyVnet --name MySnet"
 

Использование цикла и добавление каждого SE не является хорошим вариантом, так как командная строка обновления является идемпотентной.

Ответ №1:

Это связано с тем, как powershell обрабатывает переменные; $SE, который вы передаете, является одним позиционным параметром, в то время как клиент az анализирует их как отдельные. Это распространенная проблема с powershell. Например, рассмотрим приложение, которое выводит аргументы командной строки:

 > $SE = "my args"
> MyExe.exe $SE something else
 

Результатом будет:

 arg0: MyExe.exe
arg1: my args
arg2: something
arg3: else
 

Чтобы исправить это, вам нужно дать команду powershell разделить строку на массив, который (когда он создает командную строку для az ) разбивается на несколько аргументов:

 az network vnet subnet update --service-endpoints $($SE -split ' ') --resource-group MyRg1 --vnet-name MyVnet --name MySnet
 

Комментарии:

1. Большое спасибо @KommandanKeen, это отлично работает 😉

Ответ №2:

Параметр --service-endpoints принимает разделенный пробелами список служб.

Ошибка заключается в том, что вы не предоставляете список, разделенный пробелами. Вместо этого вы предоставляете простую строку с пробелами в ней.

 az network vnet subnet update --service-endpoints Microsoft.KeyVault Microsoft.Storage
 

Приведенная выше команда должна решить вашу проблему.

Обновить :

Я попробовал подход @KommandanKeen. Я не смог заставить его работать. Вы могли бы попробовать посмотреть, работает ли это на вас.

В качестве альтернативы я придумал обходной путь :

Используя выражение вызова — Invoke-Выражение оценивает строку как команду.

 Invoke-Expression "az network vnet subnet update --service-endpoints $SE --resource-group MyRg1 --vnet-name MyVnet --name MySnet"
 

В этом случае $SE расширяется и формулируется командная строка.

  az network vnet subnet update --service-endpoints Microsoft.KeyVault Microsoft.Storage......
 

Теперь командная строка вычисляется как выражение.

Комментарии:

1. Это не решение, если я хочу использовать переменную в качестве списка служб, разделенных пробелами.

2. Сама команда не сработала или вы ищете способ динамического создания конечных точек службы ?

3. Указанная вами команда будет работать в любое время. Проблема возникает при использовании переменной со значениями для конечных точек обслуживания. Например, обновление подсети виртуальной сети сети az —конечные точки обслуживания $SE —группа ресурсов MyRg1 —имя виртуальной сети MyVnet —имя MySnet

4. Я действительно ценю ваши усилия, подход КомманданКина работает в моем сценарии. Большое спасибо за ваше время 🙂