【问题标题】:How to use an enum type in powershell when configuring IIS using the powershell snapin使用 powershell 管理单元配置 IIS 时如何在 powershell 中使用枚举类型
【发布时间】:2011-11-02 22:52:33
【问题描述】:

我正在使用 IIS Powershell 管理单元从头开始配置新的 Web 应用程序。我是PS新手。以下脚本将不起作用,因为 PS 无法识别 ManagedPipelineMode 枚举。如果我将值更改为 0,它将起作用。我怎样才能让 PS 理解枚举。我尝试了 Add-Type cmdlet 并且还加载了 Microsoft.Web.Administration 程序集而没有任何成功,这些行现在已被注释。

如何让这个 PS 脚本与枚举一起工作?

#Add-Type -AssemblyName Microsoft.Web.Administration
#[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")
Import-Module WebAdministration

$AppPoolName = 'Test AppPool'

if ((Test-Path IIS:\apppools\$AppPoolName) -eq $false) {
    Write-Output 'Creating new app pool ...'
    New-WebAppPool -Name $AppPoolName
    $AppPool = Get-ChildItem iis:\apppools | where { $_.Name -eq $AppPoolName}
    $AppPool.Stop()
    $AppPool | Set-ItemProperty -Name "managedRuntimeVersion" -Value "v4.0"
    $AppPool | Set-ItemProperty -Name "managedPipelineMode" -Value [Microsoft.Web.Administration.ManagedPipelineMode]::Integrated
    $AppPool.Start()

}

错误信息是:

Set-ItemProperty : [Microsoft.Web.Administration.ManagedPipelineMode]::Integrated 不是 Int32 的有效值。

【问题讨论】:

  • AppPool.Stop 和 Apppool.Start 是否总是必要的?我现在正在创建 Webapppool 创建。所以我想知道它的意义
  • 有完整源代码示例的最终解决方案吗?

标签: iis-7 powershell


【解决方案1】:

它需要一个整数,即使基础属性的类型是ManagaedPipelineMode。但是,您可以执行以下操作:

$AppPool | Set-ItemProperty -Name "managedPipelineMode" -Value ([int] [Microsoft.Web.Administration.ManagedPipelineMode]::Classic)

PS:

代替

$AppPool = Get-ChildItem iis:\apppools | where { $_.Name -eq $AppPoolName}

你可以这样做:

$AppPool = Get-Item iis:\apppools\$AppPoolName

【讨论】:

  • 感谢您解决了错误。有没有办法不在任何地方输入命名空间“Microsoft.Web.Administration”?
  • @Pratik - 你可能想看看这里:stackoverflow.com/questions/1048954/…
  • blurgh.. 这应该可以工作,但很复杂。看我的回答;)
  • @x0n - 回复您的答案。请在给出答案之前尝试一下。我同意答案很复杂,但你应该给出一个可行的答案。
  • 在 IIS 8.5 (Win2012) 中,$appPool | set-itemproperty -Name "managedPipelineMode" -Value $managedPipelineMode 有效,但在 IIS 7.5 (Win2008) 中无效
【解决方案2】:

关于:Add-Type -AssemblyName - 这仅适用于 PowwerShell 知道的一组罐装程序集。您必须在文件系统中找到程序集并使用-Path 参数。这在我的 64 位 PowerShell 控制台中的系统上运行:

Add-Type -Path C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll

【讨论】:

  • 此响应仅用于解决 Add-Type 的问题。此外,您的 dll 路径可能会有所不同,尤其是在 x86 控制台中执行此操作时。
  • @Keith Hill:由于这个 dll 在 GAC 中可用,有没有办法从那里获取它而不是提供完整路径?我正在编写将放置在生产环境中的 powershell 脚本,如果我使用硬编码的完整路径,它可能会出错。
  • @Keith Hill:我是这样写的,而且效果很好。 $Loc= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration") Add-Type -Path $Loc.Location
【解决方案3】:

而不是使用:

$AppPool | Set-ItemProperty -Name "managedPipelineMode" `
   -Value [Microsoft.Web.Administration.ManagedPipelineMode]::Integrated

使用:

$AppPool | Set-ItemProperty -Name "managedPipelineMode" `
   -Value ([Microsoft.Web.Administration.ManagedPipelineMode]::Integrated)

或者更简洁的:

$AppPool | Set-ItemProperty -Name "managedPipelineMode" -Value Integrated

为什么?在第一个答案中需要括号的原因是因为参数绑定器在您的尝试中将整个 [Microsoft.Web.Administration.ManagedPipelineMode]::Integrated 视为一个字符串,它不能转换为该枚举类型。但是,Integrated 可以是那个枚举。通过将其包裹在方括号中,它会再次作为表达式求值,并被视为完整类型的文字。

【讨论】:

  • 你试过了吗? $AppPool | Set-ItemProperty -Name "managedPipelineMode" -Value ([Microsoft.Web.Administration.ManagedPipelineMode]::Integrated) ` 将提供Integrated is not a valid value for Int32
  • @manojlds 哦,对了,-value 没有输入到枚举中。我对它是 set-itemproperty 的事实视而不见。如果 -value 属于该枚举类型,则字符串快捷方式将起作用。哎呀。
  • 在 IIS 8.5 (Win2012) 中,$appPool | set-itemproperty -Name "managedPipelineMode" -Value $managedPipelineMode 有效,但在 IIS 7.5 (Win2008) 中无效
猜你喜欢
  • 2019-05-18
  • 2020-11-09
  • 1970-01-01
  • 2012-05-05
  • 2021-12-19
  • 1970-01-01
  • 2010-11-06
  • 2011-07-16
  • 2021-02-19
相关资源
最近更新 更多