将参数嵌入到交换机

时间:2018-10-04 01:00:46

标签: powershell parameter-passing powershell-v2.0 powershell-v3.0

我有一个.ps1来调出文件,如果无法调出文件,它将在本地查找这些文件。我想提供此选项作为参数,以使其在本地工作或从Internet提取,并指定要使用或调用的5个文件中的哪个。我使脚本可以使用“本地”和“外部”功能,但是如何为这些功能添加参数?

例如:

handlexxx = foo => { 
  const foos = this.state.foos.map(f => foo.id === f.id ? {...f, bar: !f.bar} : f
  this.setState({ foos }); 
};

./script.ps1 -local file1,file2,file3

这是我当前的代码:

./script.ps1 -external file4,file5

1 个答案:

答案 0 :(得分:2)

我将定义不同的parameter sets并按参数集名称进行区分。

[CmdletBinding(DefaultParameterSetName='default')]
Param(
    [Parameter(ParameterSetName='default', Position=0, Mandatory=$true)]
    [string[]]$Default,

    [Parameter(ParameterSetName='external', Position=0, Mandatory=$true)]
    [string[]]$External,

    [Parameter(ParameterSetName='local', Position=0, Mandatory=$true)]
    [string[]]$Local
)

# ...

switch ($PSCmdlet.ParameterSetName) {
    'local'    { RunLocal }
    'external' { RunExternal }
    'default'  { RunDefault }
}

# Usage:
# script.ps1 [-Default] 'file1', 'file2'
# script.ps1 -External 'file1', 'file2'
# script.ps1 -Local 'file1', 'file2'

另一种选择是使用选项和文件列表的单独参数,如JPBlanc所建议的那样,但是在这种情况下,您应该validate -Option参数,以便仅允许使用允许的选项。已使用:

[CmdletBinding()]
Param(
    [Parameter(Position=0, Mandatory=$true)]
    [ValidateSet('default', 'external', 'local')]
    [string]$Option,

    [Parameter(Position=1, Mandatory=$true)]
    [string[]]$File
)

# ...

switch ($Option) {
    'local'    { RunLocal }
    'external' { RunExternal }
    'default'  { RunDefault }
}

# Usage:
# script.ps1 'default' 'file1', 'file2'
# script.ps1 -Option 'default' -File 'file1', 'file2'
# script.ps1 'external' 'file1', 'file2'
# script.ps1 -Option 'external' -File 'file1', 'file2'
# script.ps1 'local' 'file1', 'file2'
# script.ps1 -Option 'local' -File 'file1', 'file2'