在 Powershell 上使用服务总线队列 InputObject 参数

Using Service Bus Queue InputObject Parameter on Powershell

我有一个 Azure 服务总线命名空间,它有数百个队列,我需要将 MaximumDeliveryCount 设置为 1 而不是默认值 10。在门户网站上手动执行此操作将显然需要时间。所以我想通过 PowerShell 脚本来完成。

不确定 -InputObject 参数应该是什么。微软文章 Set-AzServiceBusQueue says that the InputObject Type is of PSQueueAttributes given here PSQueueAttributes Class

我尝试输入 'MaxDeliveryCount' 属性但收到此错误:

Set-AzServiceBusQueue : Cannot bind parameter 'InputObject'. Cannot convert the "MaxDeliveryCount" value of type "System.String" to type 
"Microsoft.Azure.Commands.ServiceBus.Models.PSQueueAttributes".
At line:7 char:121
+ ...  $Servicebus_namespace -Name $_ -InputObject MaxDeliveryCount -WhatIf
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-AzServiceBusQueue], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Azure.Commands.ServiceBus.Commands.Queue.SetAzureRmServiceBusQueue

代码如下:

$Servicebus_queue = (Get-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace).Name

$Servicebus_queue


$Servicebus_queue.foreach{

    $Servicebus_queue = (Get-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace)

    $Servicebus_queue.MaxDeliveryCount = 1

    Set-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace -Name $_ -InputObject MaxDeliveryCount

}

我到处研究但找不到任何解决方案。此外,上面的链接路由到 Set-AzServiceBusQueue 命令的 AzureRM 模块。

如果有人能提供帮助,我们将不胜感激。

根据我的研究,如果你想使用参数InputObject,你必须提供PSQueueAttributes作为它的值。

例如:

$Servicebus_queue = (Get-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace)

    $Servicebus_queue.MaxDeliveryCount = 1

    Set-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace -Name $_ -InputObject $Servicebus_queue 

详情请参考document

更新

如果你想用PowerShell更新Service Bus Queue,请参考以下脚本

Connect-AzAccount

$ResourceGroupName=" "
$Namespace=" "

 $queues = Get-AzServiceBusQueue -ResourceGroupName $ResourceGroupName -Namespace $Namespace

 foreach($queue in $queues){

   $queue.MaxDeliveryCount = 1
   Set-AzServiceBusQueue -ResourceGroup $ResourceGroupName -NamespaceName $Namespace -QueueName $queue.Name -QueueObj $queue

 }

根据我的评论,您需要将一个队列对象(即 PSQueueAttributes 实例)传递给 Set-AzServiceBusQueue,但是您的变量赋值和你的 foreach.

下面的示例有望帮助解决问题...

# get a queue (or an array of queues). remove the ().Name as this just extracts
# their names and we really want the whole queue object. also, pluralise the
# variable name so it doesn't collide with our loop variables
$Servicebus_queues = Get-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace

$Servicebus_queues.foreach{

    # get a reference to the current ppieline variable
    # see https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-6#_
    $Servicebus_queue = $_ 

    $Servicebus_queue.MaxDeliveryCount = 1

    # -InputObject needs to be a queue (i.e. a PSQueueAttributes instance)
    Set-AzServiceBusQueue -ResourceGroupName $Resourcegroup_name -Namespace $Servicebus_namespace -Name $_ -InputObject $Servicebus_queue

}