【问题标题】:How to remove multiple IIS bindings in PowerShell fast?如何快速删除 PowerShell 中的多个 IIS 绑定?
【发布时间】:2020-09-07 01:28:38
【问题描述】:

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

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

这是我当前的代码:

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

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

任何想法如何更快地做到这一点?

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

【问题讨论】:

  • 这看起来不正确Where-Object { $_.HostHeader -notlike '*dummy*' | Remove-WebBinding } - 是错字吗?
  • @MathiasR.Jessen -是的,对不起,我会在编辑中修复它
  • 使用 WebAdministration cmdlet 注定会很慢,因为每次调用都会一遍又一遍地创建相关的底层对象。切换到 IISAadministration cmdlet 并使用单个 ServerManager 对象。这要快得多。 blogs.iis.net/bariscaglar/…
  • @LexLi 这就是解决方案,谢谢!我的 sctipt 现在运行 4 秒而不是 4 分钟(它是一个开发环境,它是 prod 环境大小的断裂)。你能写一个我能接受的完整答案吗?

标签: powershell iis iis-10 web-administration hostheaders


【解决方案1】:

尝试在 PowerShell 脚本下运行:

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

【讨论】:

  • 我不能使用 Confirm 标志,因为这个脚本应该在没有人工干预的情况下运行(部署管道的一部分)
  • @IdanLevi 您可以删除该确认标志
【解决方案2】:

从评论中复制并扩大一点。

缓慢的原因

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

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

解决方案

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

通过使用单个 ServerManager 对象并仅提交一次更改,可以更快地删除绑定。

【讨论】:

  • 谢谢!解决了它。我的 sctipt 现在运行 4 秒而不是 4 分钟(它是一个开发环境,它是 prod 环境大小的断裂)。
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
相关资源
最近更新 更多