Изменить значение параметра посреди функции

Попытка создать функцию PowerShell, которая будет выводить одну строку текста, используя несколько наборов переднего и заднего цветов. У меня есть переключатель, который определяет наборы цветов.

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

    function Write-Custom
    {
        param($Say,$ThenSay,$Level,$ExtraLevel)
        switch([array]$level)
        {
            none {$c = 'Black','White'}
            name {$c = 'Cyan','DarkBlue'}
            good {$c = 'White','DarkGreen'}
            note {$c = 'Gray','White'}
            info {$c = 'White','DarkGray'}  
            warn {$c = 'Yellow','Black'}
            fail {$c = 'Black','Red'}
        }
        $s = " $Say"
        $ts = " $ThenSay "
        Write-Host $s -ForegroundColor $c[0] -BackgroundColor $c[1]  -NoNewLine
        Clear-Variable Level
        $Level = $ExtraLevel
        Write-Host $ts -ForegroundColor $c[0] -BackgroundColor $c[1]    
    }

    Write-Custom -Say 'hi there' -Level 'name' -ThenSay 'stranger ' -ExtraLevel 'warn' 

Не удается очистить и переопределить переменную $level. Кажется, вывод «привет» должен иметь передний план/фон голубого/темно-синего цвета, а часть «незнакомца» должна быть желтой/черной... но вся строка выходит голубого/темно-синего цвета.

Нужно ли создавать более сложный переключатель?


person Local Needs    schedule 15.02.2013    source источник


Ответы (1)


Вам нужно каждый раз вызывать переключатель, чтобы получить другой набор цветов. Один из способов сделать это - поместить функцию внутри вашей функции, например:

function Write-Custom
{
    param($Say,$ThenSay,$Level,$ExtraLevel)

    function GetColors([string]$level)
    {
        switch([array]$level)
        {
            none {'Black','White'}
            name {'Cyan','DarkBlue'}
            good {'White','DarkGreen'}
            note {'Gray','White'}
            info {'White','DarkGray'}  
            warn {'Yellow','Black'}
            fail {'Black','Red'}
            default { throw "Unrecognized level $level" }
        }
    }

    $c = GetColors($Level)
    Write-Host " $Say" -ForegroundColor $c[0] -BackgroundColor $c[1]

    $c = GetColors($ExtraLevel)
    Write-Host " $ThenSay " -ForegroundColor $c[0] -BackgroundColor $c[1]
}
person Keith Hill    schedule 16.02.2013
comment
Хороший. Мне никогда не приходило в голову создавать функцию внутри функции. Спасибо! - person Local Needs; 16.02.2013