我正在使用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的有效值。
答案 0 :(得分:11)
即使基础属性的类型为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
答案 1 :(得分:2)
关于:Add-Type -AssemblyName
- 这仅适用于PowwerShell知道的一组固定装配。您必须在文件系统中找到程序集并使用-Path
参数。这在我的系统上运行在64位PowerShell控制台中:
Add-Type -Path C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll
答案 2 :(得分:0)
而不是使用:
$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
为什么呢?你在第一个答案中需要括号的原因是因为参数binder在你的尝试中将整个[Microsoft.Web.Administration.ManagedPipelineMode]::Integrated
视为一个字符串,不能转换为该枚举类型。但是,Integrated
可以是枚举。通过将其包装在括号中,它将再次作为表达式进行评估,并被视为完整类型文字。