az 使用变量更新服务终结点

az update service-endpoints using variable

我正在尝试使用更新命令向子网添加多个服务端点,并使用一个变量来表示 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 不是一个好的选择,因为更新 cmd 是幂等的。

参数 --service-endpoints 接受 space 分隔的服务列表。

错误是因为您没有提供 space 分隔的列表。相反,您提供了一个简单的字符串,其中包含 spaces。

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

以上命令应该可以解决您的问题。

更新:

我试过@KommandanKeen 的方法。我无法让它工作。你可以试一试,看看它是否适合你。

或者,我想出了一个解决方法:

通过使用 Invoke Expression - Invoke-Expression 将字符串计算为命令。

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......

现在,命令字符串被评估为表达式。

这与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