Тип параметра функции Powershell System.ConsoleColor - отсутствует ')' в списке параметров функции - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать функцию командлета в powershell с 2 аргументами. Я хочу, чтобы один из этих 2 аргументов был ConsoleColor , но ISE жалуется и говорит, что в списке параметров функции отсутствует ')'. Но я не могу найти это отсутствующим ).

Вот моя функция:

function Log {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true, ValueFromRemainingArguments=$true)]
        [AllowNull()]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [string[]]$messages,

        # If I remove the following parameter, everything works fine
        [System.ConsoleColor]$color = Default # ISE Complains here before `=`
    )

    if (($messages -eq $null) -or ($messages.Length -eq 0)) {
        $messages = @("")
    }

    foreach ($msg in $messages) {
        Write-Host $msg -ForegroundColor $color
        $msg | Out-File $logFile -Append
    }
}

Я не очень хорош в PowerShell, так что это может быть что-то глупое, что я просто еще не знаю.

1 Ответ

0 голосов
/ 17 января 2019

Проблема была отмечена в комментариях. Вы не можете просто присвоить то, что называется Default, как значение по умолчанию для вашего параметра.

Поскольку у этого перечисления нет значения по умолчанию, я предложу другой подход.

Не используйте значение по умолчанию для параметра, затем используйте условное (bleh) или splatting (super cool) для обработки этого:

Условный

function Log {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true, ValueFromRemainingArguments=$true)]
        [AllowNull()]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [string[]]$messages,

        [System.ConsoleColor]$color
    )

    if (($messages -eq $null) -or ($messages.Length -eq 0)) {
        $messages = @("")
    }

    foreach ($msg in $messages) {
        if ($color) {
            Write-Host $msg -ForegroundColor $color
        } else {
            Write-Host $msg
        }
        $msg | Out-File $logFile -Append
    }
}

Splatting

function Log {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true, ValueFromRemainingArguments=$true)]
        [AllowNull()]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [string[]]$messages,

        [System.ConsoleColor]$color
    )

    $params = @{}
    if ($color) {
        $params.ForegroundColor = $color
    }

    if (($messages -eq $null) -or ($messages.Length -eq 0)) {
        $messages = @("")
    }

    foreach ($msg in $messages) {
        Write-Host $msg @params

        $msg | Out-File $logFile -Append
    }
}
...