- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 PowerShell 和 IIS,遇到了一些关于 PowerShell 选择表示类型的方式的有趣问题。
如果我跑
Import-Module -Force WebAdministration
Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode"
它会尽职尽责地打印出来
Integrated
但是如果我然后尝试将该属性设置为
Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode" -Value "Integrated"
我得到异常:Set-ItemProperty : Integrated 不是 Int32 的有效值。
。很公平。我从谷歌上知道这种类型实际上是一个 Microsoft.Web.Administration.ManagedPipelineMode
枚举所以我需要做这样的事情才能让它工作:
Add-Type -Path C:\Windows\system32\inetsrv\Microsoft.Web.Administration.dll
$t = [Type]"Microsoft.Web.Administration.ManagedPipelineMode"
Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode" -Value ([int]("Integrated" -As $t))
这很公平,但我的问题是:如何在不使用 Google 的情况下确定属性的枚举类型?
PowerShell 确信该属性是一个字符串:
(Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode").GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
或者有时它认为这是一个由字符串支持的 NoteProperty:
(Get-Item "IIS:\AppPools\DefaultAppPool") | Get-Member -Name "startMode"
TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add
Name MemberType Definition
---- ---------- ----------
startMode NoteProperty System.String startMode=OnDemand
但我不知道如何得到实际的枚举类型。如果我能做到这一点,我就可以更加灵活地为这些属性写入值。就目前而言,我必须确保每次我设置这些属性之一时,我都必须花时间在谷歌上(这是假设我什至可以找到正确的枚举类型;有些更难以追踪)。
最佳答案
PowerShell 确信该属性是一个字符串
这是真的。这是因为此属性的父对象不是您可能期望的 Microsoft.Web.Administration.ApplicationPool
类型,而是 Microsoft.IIs.PowerShell.Framework.ConfigurationElement 类型
。您可以通过执行 (Get-Item -Path "IIS:\AppPools\DefaultAppPool").GetType().FullName
来查看。
我相信 ConfigurationElement
对象只是 IIS 使用的配置文件中 XML 节点的包装对象。在这种情况下,每个属性对应于 XML 配置文件中的一个值,因此属于 string
类型。对于您示例中的特定路径,它看起来像是在使用位于“C:\Windows\System32\inetsrv\config\applicationHost.config”的配置文件。
如果您使用的是 PowerShell ISE,您可以利用智能感知来确定有效的枚举值是什么:
否则,您可以使用Enum
类的静态GetNames
方法:
[Enum]::GetNames([Microsoft.Web.Administration.ManagedPipelineMode])
这会给你:
Integrated
Classic
如果您知道该属性是一个枚举,但您不知 Prop 体是什么类型的枚举,您可以这样做:
[Microsoft.Web.Administration.ApplicationPool].GetProperty("ManagedPipelineMode").PropertyType.FullName
哪个会返回:
Microsoft.Web.Administration.ManagedPipelineMode
如果您不知道枚举类型并且不关心枚举类型是什么,您只想知道有效的枚举值是什么,您可以这样做:
[Enum]::GetNames([Microsoft.Web.Administration.ApplicationPool].GetProperty("ManagedPipelineMode").PropertyType)
关于powershell - PowerShell 如何告诉我 IIS 属性的枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571351/
我是一名优秀的程序员,十分优秀!