【问题标题】:Wildcard (regex) as a parameter: ResourceGroupName does not match expected pattern通配符(正则表达式)作为参数:ResourceGroupName 与预期模式不匹配
【发布时间】:2016-10-24 00:12:53
【问题描述】:

我正在尝试搜索名称包含“XYZ”的 ResourceGroup,并根据其存在情况使用 Try{} Catch{} 进行处理。我确定它应该很简单,但我无法理解为什么它不喜欢这样:

Get-AzureRmResourceGroup -Name "[MK3]" #No error as it exists
Get-AzureRmResourceGroup -Name "[BLAH]" #Errors as it doesn't exist

返回的错误是:

Get-AzureRMResourceGroup : 'resourceGroupName' does not match expected pattern '^[-\w\._\(\)]+$'.
At line:1 char:1
+ Get-AzureRMResourceGroup -Name [MK3]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-AzureRmResourceGroup], ValidationException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResourceGroupCmdlet

这行得通:

Get-AzureRmResourceGroup | Where-Object{$_.ResourceGroupName -like "*MK3*"}

但是这种方法需要更多的“if”语句,我更愿意避免。

对我来说,错误提示 cmdlet 处理通配符,但我似乎无法正确使用语法。

任何建议,不胜感激。

【问题讨论】:

    标签: azure azure-powershell


    【解决方案1】:

    “Get-AzureRmResourceGroup -Name”命令应指定要获取的资源组的名称,但不允许使用通配符。

    但是我们可以使用函数来列出资源名称:

    PS C:\windows\system32> function test () {param ($name ) ;Get-AzureRmResourceGroup | Where-Object{$_.ResourceGroupName -like "$name"} }
    

    所以我们可以使用 test -name “test*” 来代替 Get-AzureRmResourceGroup: 有关 Get-AzureRmResourceGroup 的更多信息,请参考以下链接: https://msdn.microsoft.com/en-us/library/mt759838.aspx

    如果您仍有疑问,欢迎在此处回复。谢谢。
    最好的问候,

    【讨论】:

      【解决方案2】:

      谢谢@Jason Ye。在您的指导下,我想出了这个小功能:

      Function Find-ResourceGroupName
      {
          Param
          (
              [Parameter(Position=0)]
              [string]$SearchTerm
          )
      
          $ResourceGroupName = (Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -Match "\b$SearchTerm"}).ResourceGroupName
          If($ResourceGroupName)
          {
              Return $ResourceGroupName
          }
          else
          {
              Throw "Resource group matching search term not found ($SearchTerm)."
          }
      }
      
      Try
      {
          Find-ResourceGroupName "mk3"
      }
      Catch
      {
         Write-Error $Error[0]
      }
      

      可能比 if 语句更复杂,我确信有更好的方法,但它在我的脚本中运行良好。

      更新1:

      擦洗上面。使用 Find-AzureRMResource 为我完成了这项工作,它是内置的。例如:

      Find-AzureRmResource -ResourceGroupNameContains $ProjectCode | Where-Object {$_.ResourceType -like "*$ResourceType"}
      

      $ProjectCode 只是在我们的资源组名称中找到的 5 个字符的引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2019-10-08
        相关资源
        最近更新 更多