我想知道是否可以通过PowerShell远程删除队列?我有以下脚本:
cls
[Reflection.Assembly]::LoadWithPartialName("System.Messaging")
$computers = @("comp1","comp2","comp3");
foreach($computer in $computers) {
$messageQueues = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($computer);
foreach ($queue in $messageQueues) {
$endpoint = [string]::Format("FormatName:DIRECT=OS:{0}\{1}", $computer, $queue.QueueName);
Write-Host $endpoint
[System.Messaging.MessageQueue]::Delete($endpoint);
}
}
这很好用,如果我在我要删除队列的机器上运行它,但是当我远程运行时我得到错误:
The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted.
如果可以做到这一点有什么想法吗?
修改的
奇怪的是,我想我可以通过PowerShell远程登录机器并执行脚本块。但是,我不明白这样做的区别:
此:
$endpoint = [string]::Format("FormatName:DIRECT=OS:{0}\{1}", $computer, $queue.QueueName);
Invoke-Command -ComputerName $computer -ScriptBlock { [Reflection.Assembly]::LoadWithPartialName("System.Messaging"); [System.Messaging.MessageQueue]::Delete($endpoint) };
AND THIS:
Invoke-Command -ComputerName $computer -ScriptBlock { [Reflection.Assembly]::LoadWithPartialName("System.Messaging"); [System.Messaging.MessageQueue]::Delete("FormatName:DIRECT=OS:MY_SERVER\some.endpoint") };
$endpoint
的值是相同的,但由于某些奇怪的原因,尽管两个值都相同,但它并不喜欢变量方法。我通过设置$endpoint
然后调用delete来测试它。我收到错误:
Exception calling "Delete" with "1" argument(s): "Invalid value for parameter path."
我想说的是,如果我将该值硬编码为其工作的参数的一部分,但将其分配给变量然后调用我得到错误的方法
答案 0 :(得分:2)
出于历史目的,如果其他人遇到此问题或想知道如何远程删除队列,请参阅下文。
如何删除远程计算机上的专用队列?可以远程删除队列。这可以使用命令Enable-PSRemoting -Force
来实现。如果没有这个,你会遇到@JohnBreakWell指出的问题(见他的MSDN链接)。
使用Invoke-Command时变量的范围?我发现的问题是我声明的变量超出了范围(脚本块无法看到它)。为了纠正这个问题,我只做了以下几点:
重要的是argument list
和使用param
。
$computers = @("comp1","comp2");
foreach($computer in $computers) {
[Reflection.Assembly]::LoadWithPartialName("System.Messaging");
$messageQueues = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($computer);
foreach ($queue in $messageQueues) {
$endpoint = [string]::Format("FormatName:DIRECT=OS:{0}\{1}", $computer, $queue.QueueName);
Enable-PSRemoting -Force
Invoke-Command -ComputerName $computer -ScriptBlock {
param ($computer, $endpoint)
[Reflection.Assembly]::LoadWithPartialName("System.Messaging");
[System.Messaging.MessageQueue]::Delete($endpoint)
}
} -ArgumentList $computer, $endpoint
}
答案 1 :(得分:0)
答案 2 :(得分:0)
正如Schizo博士所说,你需要执行
Enable-PSRemoting -Force
在远程计算机上,但是,假设您使用的是Server 2012 r2,它就像以下一样简单:
Invoke-Command -ComputerName COMPUTERNAME { Get-MsmqQueue -Name QUEUENAME | Remove-MsmqQueue }