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
答案 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
查找动词。这些是您可以使用的允许动词。
尝试尽可能地输出对象(array
,PSCustomObject
,HashTable
,...),而不仅仅是Write-Host
,因为这仅用于可视化输出。控制台。为此,最好使用Write-Verbose
。然后,仅当您希望在控制台上显示更多信息时,才可以使用Start-Test -Verbose
运行函数。