Как использовать тип enum в powershell при настройке IIS с помощью оснастки powershell - PullRequest
9 голосов
/ 03 ноября 2011

Я использую оснастку IIS Powershell для настройки нового веб-приложения с нуля. Я новичок в PS. Следующий скрипт не будет работать, так как PS не распознает перечисление ManagedPipelineMode. Если я изменю значение на 0, оно будет работать. Как я могу получить PS, чтобы понять это перечисление. Я попробовал командлет Add-Type, а также загрузил сборку Microsoft.Web.Administration без каких-либо ошибок, теперь эти строки прокомментированы.

Как мне заставить этот скрипт PS работать с enum?

#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] :: Интегрированное недопустимое значение для Int32.

Ответы [ 3 ]

11 голосов
/ 03 ноября 2011

Ожидается целое число, хотя базовое свойство имеет тип 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
2 голосов
/ 03 ноября 2011

Относительно: Add-Type -AssemblyName - это будет работать только для стандартного набора сборок, о которых знает PowwerShell.Вы должны найти сборку в вашей файловой системе и использовать параметр -Path.Это работало на моей системе в 64-битной консоли PowerShell:

Add-Type -Path C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll
0 голосов
/ 04 ноября 2011

Вместо использования:

$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 может быть к этому перечислению. Заключив его в квадратные скобки, он снова оценивается как выражение и обрабатывается как литерал полного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...