我试图在两个站点之间交换绑定是Powershell中的IIS。下面的脚本正在运行,但似乎有点太复杂了:
$site1Name = ''
$site2Name = ''
$site1 = Get-Website | Where {$_.Name -eq $site1Name}
$site2 = Get-Website | Where {$_.Name -eq $site2Name}
$site1Bindings = $site1 | Get-WebBinding
$site2Bindings = $site2 | Get-WebBinding
$site1 | Get-WebBinding | Remove-WebBinding
$site2 | Get-WebBinding | Remove-WebBinding
function Copy-Bindings
{
param($siteA_Bindings, [string]$siteB_Name )
foreach ($binding in $siteA_Bindings)
{
$bindingInformation = $binding['bindingInformation'].Split(':')
$ip = $bindingInformation[0]
$port = $bindingInformation[1]
if ($bindingInformation.Length > 2)
{
$hostRecord = $bindingInformation[2]
}
else
{
$hostRecord = ''
}
$protocol = $binding['protocol']
New-WebBinding -Name $siteB_Name -Port $port -Protocol $protocol -IPAddress $ip -HostHeader $hostRecord
}
}
Copy-Bindings $site1Bindings $site2Name
Copy-Bindings $site2Bindings $site1Name
我想要的是更像这样的东西(伪代码):
$site1Name = ''
$site2Name = ''
$site1 = Get-Website | Where {$_.Name -eq $site1Name}
$site2 = Get-Website | Where {$_.Name -eq $site2Name}
$site1Bindings = $site1 | Get-WebBinding
$site2Bindings = $site2 | Get-WebBinding
$site1 | Get-WebBinding | Remove-WebBinding
$site2 | Get-WebBinding | Remove-WebBinding
$site1Bindings | New-WebBinding -Name $site2Name
$site2Bindings | New-WebBinding -Name $site1Name
有没有办法简化它?
谢谢,
答案 0 :(得分:0)
简短回答,不,它不能简化到所需的psudocode所代表的程度。当前功能对于IPv4站点绑定运行良好,但需要对IPv6绑定进行更多调整(拆分为[和] in除了:)。
help file for New-WebBinding显示虽然所需的参数确实采用管道输入,但是ByPropertyName(如果属性名称匹配则有效)不是ByValue(如果对象类型匹配则有效)。
仔细研究我们从$site1Bindings
变量的示例结果中得到的结果,说明原因。首先,让我们看一下对象类型:
PS C:\windows\system32> $site2Bindings | GM
TypeName:
Microsoft.IIs.PowerShell.Framework.ConfigurationElement#bindings#binding
不幸的是,New-WebBinding
不接受该对象类型以输入任何参数。这排除了直接使用它来流水线化New-WebBinding
。但是,$site2Bindings
内的属性名称怎么样?以下是一个示例:
PS C:\windows\system32> $site2Bindings | FL
protocol : http
bindingInformation : [2002:4000:200:9:900:e45e:e501:aa37]:80:
sslFlags : 0
嗯,protocol
匹配参数的名称,因此可以通过管道输入使用,但这是唯一的。因此,您必须将结果信息切断并将其分配给变量,就像您在函数中所做的那样。可能有一种更简洁的方法来删除结果,但在使用New-WebBinding
时无法避免它。