我只需从输出表中选择一个值。
代码是:
az vm list-ip-addresses --name VMname --resource-group GroupName --out table
我得到的结果如下
VirtualMachine PublicIPAddresses PrivateIPAddresses
---------------- ------------------- --------------------
VMName XX.XX.XX.XX XX.XX.XX.XX
我只想选择 PublicIPAddresses
值并将其提取到 csv。
TIA
最佳答案
Output format option --output table
(-o table
)用于人性化(表格)显示而不是用于编程处理。
最好使用基于结构化文本的输出格式,例如 JSON。
事实上,JSON 是默认输出格式,因此您可以省略您的--out table
参数并使用 ConvertFrom-Json
解析输出并提取感兴趣的值:
# Outputs all public IP addresses contained in the JSON response.
# Since you're targeting only a *single* VM, the address(es) all refer to that VM.
$ip =
(
az vm list-ip-addresses --name VMname --resource-group GroupName |
ConvertFrom-Json
).virtualMachine.network.publicIpAddresses.ipaddress
假设返回的 JSON 数据的结构与 this question 中的结构相同。 .
<小时/>请注意,您可以通过使用 --query
参数执行 JMESPath 来简化操作。 在源头查询,以便只直接返回感兴趣的值:
$ip =
(az vm list-ip-addresses --query '[].virtualMachine.network.publicIpAddresses[].ipAddress' --name VMname --resource-group GroupName |
ConvertFrom-Json)
注意:
- 您可以使用
--output tsv
进一步简化此过程,在这种情况下,您不需要ConvertFrom-Json
调用 - 请参见下文。
根据this answer ,以下使用 az vm show
的较短替代方案子命令 - 而不是 az vm list-ip-addresses
- 也有效:
$ip =
az vm show --show-details --resource-group --name vmName --query publicIps --output tsv
注意:
上面使用了不同的结构化文本格式,TSV(制表符分隔值),以及
--output tsv
,在这个简单的例子中,它避免了需要在 PowerShell 端进行后处理:- 查询仅返回一个或多个字符串值,这些值以 TSV 格式按原样输出,并且,如果有多个字符串,则每个字符串各占一行。 PowerShell 将其捕获为单个字符串或字符串数组。
为多个虚拟机(资源组中的所有虚拟机)提取公共(public) IP:
# Returns the names and public IP addresses for all VMs in the
# given resource group, as [pscustomobject] instances with
# .name and .publicIds properties (the latter being an array).
$objects =
az vm list-ip-addresses --query '[].virtualMachine.{ name: name, publicIps: network.publicIpAddresses[].ipAddress }' --resource-group GroupName |
ConvertFrom-Json
关于azure - Powershell - 从 -out 表中仅选择一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74018399/