2017-10-13 100 views
4

什么是处理参数的好习惯,我什么时候选择什么选项?正确使用参数

例如:平时我写的功能是这样的:

function Do-Something ($variable1, $variable2, $variable3....) 
    { Do Stuff } 

现在显然这也是一个选项:

Param(
    [Parameter(Position=0, 
     Mandatory=$True, 
     ValueFromPipeline=$True)] 
    [string]$userName, 
    ... 
) 

我可以,但是,没有查出为什么要使用第二或真正的优势是什么使用这个。

回答

6

第二个Param()块允许你做很多高级参数验证。

,如果我需要写最小输入验证短的功能,我会使用这样的:

Function Test-Port ([string]$Server,[uint16]$Port=80,[uint16]$Timeout = 3000) { 
    #code here 
} 

,但如果我需要写的东西有先进的检测是这样的:

function Get-SiteCert{ 
    [CmdletBinding(DefaultParameterSetName = "Return")] 
    Param(
     [Parameter(Mandatory=$true,Position=0)] 
     [string]$Server, 
     [Parameter(Position=1)] 
     [uint16]$Port=443, 
     [Parameter(Mandatory=$false, ParameterSetName="RawObj")] 
     [switch]$Raw, 
     [Parameter(Mandatory=$false, ParameterSetName="Export")] 
     [switch]$Export, 
     [Parameter(Mandatory=$true, ParameterSetName="Export")] 
     [string]$Path, 
     [uint16]$Timeout=3000 
    ) 
    #code here 
} 

即使他们是类似的脚本,我绝对不会把它全部装入顶部栏,第二个'做'更多。这实际上只是一个个案的基础。

你可以看看this link的例子,你可以用扩展参数做什么,但是如果你不需要这些随意使用你喜欢的任何东西。

3

由于@ConnorLSW在上面的答案中写道,验证是最大的好处之一。随着Param块你可以使用Validate属性,如:

Function Foo 
{ 
Param(
    [Parameter(Mandatory=$true,Position=0)] 
    [ValidateSet("Tom","Dick","Jane")] 
    [String] 
    $Name 
, 
    [ValidateRange(21,65)] 
    [Int] 
    $Age 
, 
    [ValidateScript({Test-Path $_ -PathType 'Container'})] 
    [string] 
    $Path 
) 
Process 
{ 
    write-host "New-Foo" 
} 

}

你也可以定义不同的参数设置,如果你的函数应支持不同的参数组合。此外,如果您是Parameter属性的MandatoryPositional属性,则还会通过Get-Help获得“开箱即用”文档。例如: -

get-help Foo -Detailed 

NAME 
    Foo 

SYNTAX 
Foo [-Name] {Tom | Dick | Jane} [[-Age] <int>] [-Path <string>] [<CommonParameters>] 


PARAMETERS 
-Age <int> 

-Name <string> 

-Path <string> 

<CommonParameters> 
    This cmdlet supports the common parameters: Verbose, Debug, 
    ErrorAction, ErrorVariable, WarningAction, WarningVariable, 
    OutBuffer, PipelineVariable, and OutVariable. For more information, see 
    about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216). 


ALIASES 
    None 

REMARKS 
    None 

基础上Age参数你会认为这是可选参数的出括号。所以关于描述,验证和文档。

希望有所帮助。

+0

感谢您的信息。澄清了很多。将需要我的新脚本的第二块。 – Jos