- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在对象中进行管道传输时,我遇到了 New-WebBinding 的问题。我有一个定义 5 个属性的对象:名称、协议(protocol)、端口、IPAddress 和 HostHeader(New-WebBinding cmdlet 支持所有 5 个属性作为接受管道输入:ValueByPropertyName)。然而,当你在这个对象中使用管道时,它仍然请求一个 Name: 被提交。如果您想复制问题,这里有一个快速测试功能。如果您在提示符下按 Enter,它会成功处理对象,并添加绑定(bind)。但是提示本身将其破坏为非交互式脚本。
我已经用 PS v3 和 PS v4 对此进行了测试。
我很确定我做这一切都是正确的,但想确保没有我可能忽略的东西。现在我只是在没有这个问题的 foreach 循环中遍历我的对象集合,但想看看这是否是我应该报告的错误。
function Test-WebBinding{
[CmdletBinding()]
Param()
$testBindingCol = @()
$testBinding1 = New-Object System.Object
$testBinding1 | Add-Member -MemberType NoteProperty -Name Name -Value 'Default Web Site'
$testBinding1 | Add-Member -MemberType NoteProperty -Name Protocol -Value 'https'
$testBinding1 | Add-Member -MemberType NoteProperty -Name Port -Value '4000'
$testBinding1 | Add-Member -MemberType NoteProperty -Name IPAddress -Value '*'
$testBinding1 | Add-Member -MemberType NoteProperty -Name HostHeader -Value 'Test4000'
$testBindingCol += $testBinding1
$testBinding2 = New-Object System.Object
$testBinding2 | Add-Member -MemberType NoteProperty -Name Name -Value 'Default Web Site'
$testBinding2 | Add-Member -MemberType NoteProperty -Name Protocol -Value 'http'
$testBinding2 | Add-Member -MemberType NoteProperty -Name Port -Value '4001'
$testBinding2 | Add-Member -MemberType NoteProperty -Name IPAddress -Value '*'
$testBinding2 | Add-Member -MemberType NoteProperty -Name HostHeader -Value 'Test4001'
$testBindingCol += $testBinding2
$testBindingCol | New-WebBinding
}
最佳答案
PetSerAl 在上面的评论中提出了正确的想法:
One workaround would be to change current location to some site (
cd IIS:\Sites\SomeSite
), it does not really matter to which
New-WebBinding
我加载了
Microsoft.IIS.PowerShell.Provider
的行为方式包含此内容和其他内容的程序集
WebAdministration
cmdlet 进入 dotPeek。程序集位于 GAC 中,因此您告诉 dotPeek“从 GAC 打开”。
NewWebBindingCommand
.
[Parameter(ValueFromPipelineByPropertyName = true)]
修饰。属性,所以这是一个好的开始,管 Prop 有匹配属性名称的对象数组应该可以工作:
NewWebBindingCommand
最终继承自
System.Management.Automation.Cmdlet
并且在这种情况下覆盖了
BeginProcessing
方法。如果被覆盖,
BeginProcessing
由 PowerShell 调用并“为 cmdlet 提供一次性预处理功能”。
BeginProcessing
很重要。在处理任何管道馈送的命名参数并将其绑定(bind)到 cmdlet 的属性之前调用 override (请参阅:
Cmdlet Processing Lifecycle (MSDN) )。
New-WebBinding
BeginProcessing
cmdlet 的实现好像:
protected override void BeginProcessing()
{
base.BeginProcessing();
if (!string.IsNullOrEmpty(this.siteName))
return;
this.siteName = this.GetSiteName("Name");
}
this.siteName
是
Name
的私有(private)成员值将绑定(bind)到
-Name
的属性范围。当我们到达
if(...)
`this.siteName 上面的语句还没有绑定(bind)(它是空的),因此落入:
this.siteName = this.GetSiteName("Name");
GetSiteName()
调用 cmdlet 的直接基类
HelperCommand
它提供了许多对许多不同的有用的“帮助”方法
WebAdministration
cmdlet。
HelperCommand.GetSiteName(string prompt)
看起来像这样:
protected string GetSiteName(string prompt)
{
PathInfo pathInfo = this.SessionState.PSVariable.Get("PWD").Value as PathInfo;
if (pathInfo != null && pathInfo.Provider.Name.Equals("WebAdministration", StringComparison.OrdinalIgnoreCase))
{
string[] strArray = pathInfo.Path.Split('\\');
if (strArray.Length == 3 && strArray[1].Equals("sites", StringComparison.OrdinalIgnoreCase))
return strArray[2];
}
if (!string.IsNullOrEmpty(prompt))
return this.PromptForParameter<string>(prompt);
return (string) null;
}
Kevulator
,抱歉)并拉入了
New-WebBinding
cmdlet 的
BeginProcessing()
代码和来自
New-WebBinding
的代码的基类辅助方法
GetSiteName()
.
GetSiteName
在 VS2015 中,当附加到绑定(bind)到
New-Kevulator
的 PowerShell session 管道时:
Name
由
siteName
支持的属性(property)还没有绑定(bind),还在
null
(如上所述导致
GetSiteName
被执行)。我们也刚刚越过这条线上的一个断点:
PathInfo pathInfo =
this.SessionState.PSVariable.Get("PWD").Value as PathInfo;
C:\>
提示,因此提供者名称将为
FileSystem
.我用第二个箭头突出显示了这一点。
Import-Module WebAdministration
和
CD IIS:
然后重新运行并再次中断您可以看到路径提供程序已更改为
WebAdministration
负责处理里面的生命
IIS:>
超越:
pathInfo
名称不等于
WebAdministration
,即我们不在
IIS:
提示,然后代码失败并提示
Name
命令行中的参数,就像您所经历的那样。
pathInfo
值为
WebAdministration
然后会发生两件事之一:
IIS:
或
IIS:\Sites
代码失败并提示
Name
范围。
IIS:\Sites\SomeSiteName
然后
SomeSiteName
返回并有效地变为
-Name
参数值,我们从
GetSiteName()
中退出功能返回
BeginProcessing
.
IIS:\Sites\MySite
然后你可以输入该站点的绑定(bind)数组,但不指定
Name
范围。或者,如果您确实提供了
Name
对象的管道数组中的属性,那么这些将覆盖从您的
IIS:\Sites\MySite
中选取的默认站点名称。语境。
BeginProcessing
已经运行我们的管道命名参数现在实际上已绑定(bind),然后是
ProcessRecord
方法被调用,这就是
New-WebBinding
的肉和土 bean 工作必须执行。
New-WebBinding
除非您将当前工作目录更改为 IIS 网站,否则不会绑定(bind)管道参数,例如
cd iis:\Sites\MySite
.
关于具有名称属性的 Powershell New-WebBinding 管道问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419625/
作为部署脚本的一部分,我想保存当前网站上的所有绑定(bind)——但我想将它们保存为可用于以后重新创建它们的格式。 到目前为止,我有这个: Import-module WebAdministr
在对象中进行管道传输时,我遇到了 New-WebBinding 的问题。我有一个定义 5 个属性的对象:名称、协议(protocol)、端口、IPAddress 和 HostHeader(New-We
我们使用的是 Windows 2012 Server R2。 我们正在尝试自动创建 LetsEncrypt 证书。我们正在使用 LetsEncrypt-Win-Simple ( https://git
我正在尝试为我的 IIS 网站添加 MSMQ 绑定(bind),正确的绑定(bind)应如下所示: 所以我在 PowerShell 中执行以下行: New-WebBinding -Name "My S
我正在尝试通过 ID(与名称)检索我引用的网站的 IP 地址。我能想到的最好方法是在“bindingInformation”属性上使用正则表达式,直到第一个冒号,如下所示...... $siteID
我是一名优秀的程序员,十分优秀!