gpt4 book ai didi

powershell - PowerShell 如何告诉我 IIS 属性的枚举类型?

转载 作者:行者123 更新时间:2023-12-02 03:14:56 24 4
gpt4 key购买 nike

我正在使用 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,您可以利用智能感知来确定有效的枚举值是什么:

enter image description here

否则,您可以使用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com