如何在PowerShell中为脚本提供param属性?

sbi*_*sbi 16 parameters powershell

我有这个脚本可以通过两种方式调用:

MyScript -foo path\to\folder
Run Code Online (Sandbox Code Playgroud)

要么

MyScript -bar path\to\folder
Run Code Online (Sandbox Code Playgroud)

(也就是说,我可以传递一个开关加上一个文件夹或一个字符串参数加上一个文件夹.)

我试图将参数声明放入我的脚本中以反映该语法:

param(
  [parameter(Mandatory=$false)] [switch]$foo,
  [parameter(Mandatory=$false)] [String]$bar,
  [parameter(Mandatory=$true)]  [System.IO.FileInfo]$path
)
Run Code Online (Sandbox Code Playgroud)

但是我必须path明确地传递以调用脚本:

MyScript -l -path path\to\folder
Run Code Online (Sandbox Code Playgroud)

那么(如何)我可以做到这两个barpath位置参数?

注意:如果我选择了一个非常愚蠢的语法来调用脚本,我仍然可以更改它.

x0n*_*x0n 27

一些事情:您需要使用参数集来告诉PowerShell有相互排斥的方式来调用您的脚本; 也就是说,你不能同时使用开关和字符串.这些集合还允许您设置两者的位置$bar并且$filepath位于索引0.开关不需要按位置放置,因为它们对于活页夹没有模糊并且放置在任何位置.此外,每组中至少应有一个参数是强制性的.

function test-set {
    [CmdletBinding(DefaultParameterSetName = "BarSet")]
    param(
        [parameter(
            mandatory=$true,
            parametersetname="FooSet"
        )]
        [switch]$Foo,

        [parameter(
            mandatory=$true,
            position=0,
            parametersetname="BarSet"
        )]
        [string]$Bar,

        [parameter(
            mandatory=$true,
            position=1
        )]
        [io.fileinfo]$FilePath
    )
@"
  Parameterset is: {0}
  Bar is: '{1}'
  -Foo present: {2}
  FilePath: {3}
"@ -f $PSCmdlet.ParameterSetName, $bar, $foo.IsPresent, $FilePath
}
Run Code Online (Sandbox Code Playgroud)

CmdletBinding如果在没有参数的情况下调用函数,则需要该属性来指定哪个参数集应该是默认值.

以下是上述配置的语法帮助:

PS> test-set -?

NAME
    test-set

SYNTAX
    test-set [-Bar] <string> [-FilePath] <FileInfo>  [<CommonParameters>]

    test-set [-FilePath] <FileInfo> -Foo  [<CommonParameters>]
Run Code Online (Sandbox Code Playgroud)

这是各种调用的输出:

PS> test-set barval C:\temp\foo.zip
  Parameterset is: BarSet
  Bar is: 'barval'
  -Foo present: False
  FilePath: C:\temp\foo.zip

PS> test-set -foo c:\temp\foo.zip
  Parameterset is: FooSet
  Bar is: ''
  -Foo present: True
  FilePath: c:\temp\foo.zip
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.