Iis 7 使用powershell管理单元配置IIS时如何在powershell中使用枚举类型

Iis 7 使用powershell管理单元配置IIS时如何在powershell中使用枚举类型,iis-7,powershell,Iis 7,Powershell,我正在使用IIS Powershell管理单元从头配置新的web应用程序。我是PS新手。由于PS无法识别ManagedPipelineMode枚举,以下脚本将无法工作。如果我将该值更改为0,它将起作用。如何让PS理解该枚举。我尝试了Add-Type cmdlet,也加载了Microsoft.Web.Administration程序集,但没有任何SCUCESS,这些行现在已被注释 如何使此PS脚本与枚举一起工作 #Add-Type -AssemblyName Microsoft.Web.Admin

我正在使用IIS Powershell管理单元从头配置新的web应用程序。我是PS新手。由于PS无法识别ManagedPipelineMode枚举,以下脚本将无法工作。如果我将该值更改为0,它将起作用。如何让PS理解该枚举。我尝试了Add-Type cmdlet,也加载了Microsoft.Web.Administration程序集,但没有任何SCUCESS,这些行现在已被注释

如何使此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的有效值


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

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

而不是

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

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

关于:
添加类型-AssemblyName
-这只适用于PowwerShell知道的一组封装程序集。您必须在文件系统中找到程序集并使用
-Path
参数。这在64位PowerShell控制台中对我的系统有效:

Add-Type -Path C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll
而不是使用:

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

或者更简洁地说:

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

为什么??在第一个答案中需要括号的原因是,参数binder将尝试中的整个
[Microsoft.Web.Administration.ManagedPipelineMode]::Integrated
视为字符串,无法转换为该枚举类型。但是,
Integrated
可以集成到该枚举中。通过将其包装在括号中,它将再次作为表达式进行计算,并被视为完整类型文字。

感谢您解决了此错误。有没有办法不在任何地方键入名称空间“Microsoft.Web.Administration”?@Pratik-您可能想看看这里:Blugh。。这应该是可行的,但很复杂。看我的答案;)@x0n-回答中的回答。请在给出答案之前先尝试一下。我同意答案很复杂,但您应该给出一个有效的答案。在IIS 8.5(Win2012)中,$appPool | set itemproperty-名称“managedPipelineMode”-值$managedPipelineMode可以工作,但在IIS 7.5(Win2008)中不工作。此响应仅用于解决添加类型的问题。此外,您到dll的路径可能不同,尤其是在x86控制台中执行此操作时。@Keith Hill:由于GAC中有此dll,是否有任何方法可以从那里获取它,而不是提供完整路径?我正在编写powershell脚本,该脚本将放在生产环境中,如果我使用硬编码的完整路径,它可能最终会出错。@Keith Hill:我是这样写的,它可以工作$Loc=[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.Web.Administration”)添加类型-Path$Loc.location您尝试过吗
$AppPool | Set ItemProperty-Name“managedPipelineMode”
-Value([Microsoft.Web.Administration.managedPipelineMode]::Integrated)`将给出
Integrated对于Int32
@manojlds不是有效的值哦,对了,-值未键入枚举。我没有意识到它是被设置为属性的。如果-value是该枚举类型,则字符串快捷方式将起作用。oops.在IIS 8.5(Win2012)中,$appPool | set itemproperty-名称“managedPipelineMode”-值$managedPipelineMode可以工作,但在IIS 7.5(Win2008)中不工作。是否始终需要appPool.Stop和appPool.Start?我现在正在创建Webapppool。因此,我想知道安泰最终解决方案的意义,并提供完整的源代码示例?
$AppPool | Set-ItemProperty -Name "managedPipelineMode" -Value Integrated