以下是我使用两者的观点。并不是说其中一个比另一个更好。它们都有优缺点。
Azure CLI是跨平台的命令行工具,用于管理Azure资源,可在Windows、Mac和Linux上运行。这也意味着它可以在Windows PowerShell上运行。与Azure PowerShell相比,它更加灵活,因为它是一个二进制文件,可以在任何操作系统默认shell中运行,不需要解释,并保留HTML标签。
在PowerShell上运行CLI命令有什么后果吗?
更新可能有点麻烦。如果想在 Windows 上更新,您需要按照 在 Windows 上安装 Azure CLI 的说明重新安装 MSI。在其他平台上更新更容易,这让我只想在 Windows PowerShell 上使用 Azure PowerShell。一种解决方法是在 Windows 上使用 WSL,然后您可以在 Windows 机器内运行 Linux 上的 Azure CLI。您可以在 Windows 10 上的 Windows 子系统安装指南 中安装 WSL。我发现使用 apt-get
在 Linux 上更新 azure-cli
包比在 Windows 上容易得多。您可以查看 使用 apt 安装 Azure CLI 以了解如何在 Linux 上安装 Azure CLI 包。
另一个区别是,你必须使用 Azure CLI 链接多个命令,例如
az group list
与 Azure PowerShell 中的
Get-AzResourceGroup
。你也不能像在 Azure PowerShell 中那样运行
Get-Help
命令来获取 Azure CLI 命令的帮助信息,这对我来说是一个巨大的改变,因为我发现 PowerShell 的帮助系统非常有用,可以显示有关 PowerShell Cmdlets 的详细信息。Azure CLI 的帮助信息可以通过
az --help
找到,但不如
Get-Help
全面。
当在 Windows PowerShell 中使用 Azure CLI 时,Tab 键补全也无法使用,这使得输入有些麻烦,这也是我在 Windows 中使用 WSL 的另一个原因。您可以查看此
Autocompletion support in Windows command line GitHub 问题的其他替代方案。
Azure PowerShell是一组用于从命令行管理Azure资源的PowerShell Cmdlets,只能在Windows PowerShell和PowerShell Core中使用。这也意味着,如果运行PowerShell Core的其他操作系统(如Mac或Linux),则它也可以运行Azure PowerShell。
“我只尝试了一些基本命令,它们都可以工作,除了筛选命令| find只能在CLI中使用,而| Select只能在PowerShell中使用。”
Select-Object
或其简称Select
是PowerShell Cmdlet,因此仅适用于PowerShell对象。find
可以搜索字符串或文本文件。此外,如果您正在从Azure CLI搜索数据,则应使用--query
参数而不是find
,因为find
仅限于在文本中搜索字符串。Azure CLI使用JMESPath查询语言来搜索您接收到的JSON输出中的数据。如果您熟悉此查询语言,则使用Azure CLI搜索数据不应该是太大的问题。此外,您还可以在PowerShell脚本中使用Azure CLI命令,但反之则不行。
摘要
如果你需要处理多个平台或者想要与使用不同平台的人编写脚本,使用Azure CLI是一个好选择。然而,如果你主要处理Windows系统并且与其他人一起工作,那么使用Azure PowerShell是一个好主意。如果像我一样需要在不同的平台上使用,那么安装两者都是一个好主意。如果你仍然只想在不同的操作系统平台上使用Azure PowerShell,则需要PowerShell Core。
对于简单的任务,例如在云shell中快速查找资源或编写快速脚本,使用Azure CLI很好,并且比Azure PowerShell更简洁。如果你已经经常使用bash,这会感觉更自然,并且将Azure CLI命令添加到现有脚本将是一个简单的任务。正如其他人所说,没有任何阻止你将Azure CLI命令添加到powershell脚本中,这允许你使用ConvertFrom-Json
将JSON输出反序列化为PSCustomObject
。
对于更复杂的任务,Azure PowerShell更可取,因为使用.NET对象/OOP原则比解析从Azure CLI给出的JSON文本要容易得多。这是我尽可能使用Azure PowerShell的原因之一。
Azure CLI受益于具有幂等性,因此对资源运行相同的命令不需要像Azure PowerShell那样进行任何空值检查。如果这成为问题,则可以在Azure PowerShell中运行ARM模板,这些模板具有幂等性。
更新
正如@AimusSage在评论中提到的那样,最近发布了 PowerShell 7.0,它代替了原来的名称 PowerShell Core 或 PowerShell 6.x。您可以在 Announcing PowerShell 7.0 中阅读更多信息。
另一个想法
如果您想要保持 Azure PowerShell 的面向对象编程原则,但同时又希望使用对于 Linux 系统管理员更容易使用的工具,则可以考虑使用 Azure SDK for Python。我过去就在 Linux 主机上运行脚本时使用过该工具,这样就不必使用 Azure CLI 或安装 PowerShell。