如何快速删除 PowerShell 中的多个 IIS 绑定?

How to remove multiple IIS bindings in PowerShell fast?

在版本升级过程中,我们当前的解决方案从一个站点获取所有绑定(两个虚拟 url 除外)并在另一个站点上设置它们。

我目前正在通过 PowerShell 删除绑定,但速度非常慢。我查看了 SO 中的每个线程,几乎每个解决方案都使用 "Remove-WebBinding".

这是我当前的代码:

Get-Website -Name $siteName | Get-WebBinding  | Where-Object { $_.HostHeader -notlike '*dummy*' } | Remove-WebBinding;

我有 272 个(-2 个虚拟)绑定要删除,这需要大约 3 分钟。

有什么办法可以更快吗?

顺便说一句:一个一个地添加所有这些绑定也非常慢,但我想如果我能在这里找到答案,类似的解决方案也可以用于添加。

尝试 运行 下面的 PowerShell 脚本:

Import-Module WebAdministration  
Get-WebBinding -HostHeader 'dummy' | Remove-WebBinding -Confirm:$true

从评论中复制并稍微展开。

缓慢的原因

WebAdministration cmdlets 是很久以前设计的,有很多缺点。

您观察到的缓慢可以解释为设计使然。虽然它不是开源的,但我们可以猜测,每次调用 Remove-WebBinding 都会创建相关的底层对象(如 ServerManager),然后将更改提交到 IIS 配置文件。因此,要删除的绑定越多,所需的时间就越长(消耗的资源也就越多)。

解决方案

对于今天(8+)所有支持的 IIS 版本,您应该改用 IISAdministration cmdlets。它们是新开发的,兼顾了灵活性和性能。

通过使用单个 ServerManager 对象并仅提交一次更改,删除绑定的速度会快得多。