Ответ 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
Надеюсь, что это поможет.