Как предоставить атрибуты param для script в Powershell? - программирование
Подтвердить что ты не робот

Как предоставить атрибуты param для script в Powershell?

У меня есть этот script, который можно вызвать двумя способами:

MyScript -foo path\to\folder

или

MyScript -bar path\to\folder

(То есть, я могу либо передать переключатель плюс папку, либо строковый аргумент плюс папку.)

Я попытался поместить объявления параметров в свой script, чтобы отразить этот синтаксис:

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

Но тогда я должен явно передать path, чтобы вызвать script:

MyScript -l -path path\to\folder

Итак (как) я могу сделать это, создавая как позиционные параметры bar, так и path?

Примечание. Если я выбрал необычайно глупый синтаксис для вызова script, я все равно могу его изменить.

4b9b3361

Ответ 1

Несколько вещей: вам нужно использовать набор параметров, чтобы сообщить PowerShell, что существуют взаимоисключающие способы вызова вашего script; то есть вы не можете использовать переключатель и строку одновременно. Наборы также позволяют вам установить положение как $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
}

Атрибут CmdletBinding необходим, чтобы указать, какой набор параметров должен быть по умолчанию, если функция вызывается без параметров.

Здесь синтаксическая справка для указанной выше конфигурации:

PS> test-set -?

NAME
    test-set

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

    test-set [-FilePath] <FileInfo> -Foo  [<CommonParameters>]

И здесь вывод для различных вызовов:

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

Надеюсь, что это поможет.

Ответ 2

В качестве объяснения здесь вы можете указать положение параметра вашего параметра.

[parameter(Position=0)]