Передача переключателей (например, -IncludeManagementTools) в Install-WindowsFeature в качестве переменных - PullRequest
0 голосов
/ 07 сентября 2018

Я использую это как способ, наконец, правильно использовать Stackoverflow!

Я пытаюсь запустить следующую строку как часть более крупного скрипта:

Install-WindowsFeature Web-Server -IncludeManagementTools

Что, очевидно, работает само по себе, но не тогда, когда я пытаюсь передать "-IncludeManagementTools" как часть переменной.

Я читаю в списке функций для установки как часть текстового файла, и некоторые из них имеют параметры параметров, такие как -IncludeManagementTools. Передача первой части «Веб-сервер» работает нормально, передача второй части - нет, если только не вводить текст непосредственно на консоль, то есть

    $var="Web-Server"        
    Install-WindowsFeature $var -IncludeManagementTools

Полный текущий код приведен ниже; Я попытался разделить переменную, а также то, что ниже, и использовать операторы Switch вместо циклов if, но необязательный параметр всегда неправильно интерпретируется как имя устанавливаемой функции, например:

    $currentline = "Web-Server -IncludeManagementTools"
    Install-WindowsFeature $currentline.Split(" ")[0]

Работает, но

    $currentline = "Web-Server -IncludeManagementTools"
    Install-WindowsFeature $currentline.Split(" ")[0] $currentline.split(" ")[1]

Сбой. Любая помощь с благодарностью!

Полный код:

Param(
    [Parameter(Mandatory=$true,Position=1)]
    [string]$ConfigFilePath
)

$featurelist = Import-Csv $ConfigFilePath

# Install requested features
$featurelist | % {
    # The install commands have some optional switches which could be in the input file
    # to avoid an error reading in the Install-* commands, split on " " and feed into the command as seperate strings
    If ( $_.feature -contains " " ) {
        If ( $_.feature -eq "-IncludeManagementTools") {Install-WindowsFeature -Name "($_.feature.Split(" ")[0]) -IncludeManagementTools"}
        Else {}
        If ( $_.feature -eq "-IncludeAllSubFeature") { Install-WindowsFeature -Name "($_.feature.Split(" ")[0]) -IncludeAllSubfeature" }
        Else {}
        }
    Else {
        Install-WindowsFeature -Name $_.feature
    }
}

$installed = @()

# Check installs work
$featurelist | % {
    # The install commands have some optional switches which could be in the input file
    # to avoid an error reading in the Get-* commands, remove anything that comes after a space (ie effectively removing optional switches)
    $installed += Get-WindowsFeature -Name $_.feature.Split(" ")[0]
    }

$missing = $installed | ? { $_.Installed -eq $false }

If (!($missing)) {
    Write-Host "All requested features installed ok." -ForegroundColor Green -BackgroundColor Black
}
Else {
    Write-Host "Some features requested weren't installed.  They will be outputted below." -ForegroundColor Black -BackgroundColor Red
    $missing
}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

После запуска

Install-WindowsFeature Web-Server -IncludeManagementTools

Запустите следующее

Get-WindowsFeature

Должны отображаться все установленные функции Windows. Все, что включено в переключатель «Включить средства управления», разбито и имеет свое собственное имя функции. Таким образом, все может быть установлено с помощью 'Install-WindowsFeature -Name xxx'

0 голосов
/ 07 сентября 2018

Это не прямой ответ, это скорее рекомендация изменить структуру вашей установки на что-то более понятное и более понятное.

Мне кажется, вы выиграли бы от использования splatting . Он позволяет использовать хеш-таблицу для хранения параметров команды, что может немного облегчить динамические параметры.

$WindowsFeatureParameters = @{
    Name = 'Web-Server'
    IncludeManagementTools = $true
}
Install-WindowsFeature @WindowsFeatureParameters

Я бы также изменил ваш CSV-файл, чтобы иметь разные столбцы для каждого параметра. Представьте себе что-то вроде:

FeatureName,IncludeManagementTools,IncludeAllSubFeature
Web-Server,Yes,No

Теперь вы можете указать:

$FeatureList = Import-Csv $ConfigFilePath 
foreach ($Feature in $FeatureList) {
    $WindowsFeatureParameters = @{
        Name = 'Web-Server'
        IncludeManagementTools = ($Feature.IncludeManagementTools -eq 'Yes')
        IncludeAllSubFeature= ($Feature.IncludeAllSubFeature -eq 'Yes')
    }
    Install-WindowsFeature @WindowsFeatureParameters
}

$Installed = foreach ($Feature in $FeatureList) {
    Get-WindowsFeature -Name $Feature.FeatureName
}

$Missing = $Installed | Where-Object Installed -eq $false

Альтернативно, вы можете указать переменную с переключателем для управления ее значением:

# Install with management tools
$ManagementTools = $true
Install-WindowsFeature 'Web-Server' -IncludeManagementTools:$ManagementTools

# Install without management tools
$ManagementTools = $false
Install-WindowsFeature 'Web-Server' -IncludeManagementTools:$ManagementTools

Очевидно, $ManagementTools может быть установлен любым логическим тестом.

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