我正在尝试搜索名称中包含" 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*"}
但是这种方法需要更多,如果'我更愿意避免的陈述。
对我来说,错误建议cmdlet处理通配符,但我似乎无法正确使用语法。
任何建议,非常感谢。
答案 0 :(得分: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
如果您仍有疑问,欢迎回复此处。谢谢。
最诚挚的问候,
答案 1 :(得分:0)
谢谢@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语句更复杂,我确信有更好的方法,但它在我的脚本中运行良好。
在上面擦洗。使用Find-AzureRMResource为我完成工作,它是内置的。例如:
Find-AzureRmResource -ResourceGroupNameContains $ProjectCode | Where-Object {$_.ResourceType -like "*$ResourceType"}
$ ProjectCode只是在我们的资源组名称中找到的5个字符的引用。