#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. Я действительно ценю ваши усилия, подход КомманданКина работает в моем сценарии. Большое спасибо за ваше время 🙂