Powershell cmdlet参数定义包含以$开头的参数名称,在默认行为中创建更改

时间:2018-10-31 09:24:26

标签: powershell cmdlets

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 :(得分:0)

我认为这可以为您澄清一些事情:

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查找动词。这些是您可以使用的允许动词。

尝试尽可能地输出对象(arrayPSCustomObjectHashTable,...),而不仅仅是Write-Host,因为这仅用于可视化输出。控制台。为此,最好使用Write-Verbose。然后,仅当您希望在控制台上显示更多信息时,才可以使用Start-Test -Verbose运行函数。