Определение параметра командлета Powershell, содержащее имя параметра, начинается с $ создавая изменение по умолчанию - PullRequest
0 голосов
/ 31 октября 2018
function Test1 {
    [CmdletBinding()]
    Param (
        [Parameter( Position = 0, ValueFromPipeline = $true,   ValueFromPipelineByPropertyName = $true, Mandatory = $false)]
        [String]
        ${$count},
        [Parameter( Position = 1,ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Mandatory = $false)]
        [String]
        ${$inlinecount}
    )
    Process { 
         Write-Host "TEST1 ${$count} : ${$inlinecount}"
    }
}

Вызов функции, как показано ниже

PS> Test1 10 20
    TEST1 10:20
PS> Test1 -$count 10
    TEST1   : 10
PS> Test1 -$inlinecount 100
    TEST1   : 100
PS> Test1  -$count 10 -$inlinecount 100
    Error Test1 : A positional parameter cannot be found that accepts argument '-'.

Я не могу указать только одно значение, т. Е. Только $ count, он принимает 'Test1 $ count 10' с $ count в качестве значения для $ count и 10 в качестве значения для $ inlinecount. Я не хотел удалять префикс $ с каждым именем параметра. Также невозможно указать оба значения параметра по имени

Как я могу изменить определение параметра, чтобы в результате получилось следующее

PS> Test1 -$count 10
    TEST1 10 :
PS> Test1 -$inlinecount 100
    TEST1   :100
PS> Test1  -$count 10 -$inlinecount 100
    TEST1   10:100

1 Ответ

0 голосов
/ 31 октября 2018

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

Function Start-Test1 {
    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [String[]]$Count,
        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName )]
        [String]$InlineCount
    )

    Process { 
        [PSCustomObject]@{
            Count = $Count
            InlineCount = $InlineCount
        }
        Write-Verbose "TEST1 ${$count} : ${$inlinecount}"
    }
}

# No parameters, empty result
Start-Test1

# Only one parameter, output Count = 1
Start-Test1 -Count 1

# Only one parameter, output InlineCount = A
Start-Test1 -InlineCount A

# Two parameters, output Count = 1 InlineCount = A
Start-Test1 -Count 1 -InlineCount A


# Multiple input for Count
Start-Test1 -Count 1, 2, 3

Знак доллара используется только один раз в предложении Param для каждого параметра. Это также облегчает чтение.

Определение позиций с помощью Position = 1 и т. Д. Требуется только тогда, когда параметры не в порядке. В этом случае они могут быть опущены. То же самое касается Mandatory = $false, когда он опущен, PowerShell по умолчанию предполагает, что параметр не является обязательным. Но когда вы пишете Mandatory, предполагается, что вы имеете в виду, что параметр является обязательным. Поэтому нет необходимости использовать логическое значение $true/$false.

Если вы хотите принять несколько аргументов для одного параметра, вы можете использовать []. Например, [String]$Name принимает только одно имя, но [String[]]$Name принимает несколько имен.

Несколько советов:

Некоторые замечания, всегда используйте правильное имя функции. Вы можете найти глаголы с помощью Get-Verb. Это разрешенные глаголы, которые вы можете использовать.

Попробуйте вывести объект (array, PSCustomObject, HashTable, ...), когда это возможно, а не просто Write-Host, потому что это полезно только для визуализации вывода в консоли. Для этого лучше использовать Write-Verbose. Затем вы можете запустить свою функцию с помощью Start-Test -Verbose только в том случае, если вы хотите, чтобы на консоли отображалась дополнительная информация.

...