#powershell
Вопрос:
Допустим, у меня есть код perl, который считывает флаги из командной строки:
#default values $opt_redflag = 0; $opt_blueflag = 0; $opt_target = "none"; $opt_type = "infinite"; %options = ( 'redflag' =gt; $opt_redflag, 'blueflag' =gt; $opt_blueflag, 'target=s' =gt; $opt_target, 'type=s' =gt; $opt_type ); GetOptions(%options);
Как бы я преобразовал это в эквивалентную команду Powershell param. Я думаю, что это было бы так:
param( [Parameter(Mandatory=$false)] [alias("redflag")] [bool]$opt_redflag=$false, [Parameter(Mandatory=$false)] [alias("blueflag")] [bool]$opt_blueflag=$false, [Parameter(Mandatory=$false)] [alias("target")] [string]$opt_target="none", [Parameter(Mandatory=$false)] [alias("infinite")] [string]$opt_type="infinite" ); write-host "redflag: $opt_redflag" write-host "blueflag: $opt_blueflag" write-host "target: $opt_target" write-host "type: $opt_type" exit 1;
однако я получаю эту ошибку:
PS C:Usersdudegt; .setup2.ps1 C:Usersdudesetup2.ps1 : Parameter set cannot be resolved using the specified named parameters. At line:1 char:1 .setup2.ps1 ~~~~~~~~~~~~ CategoryInfo : InvalidArgument: (:) [setup2.ps1], ParameterBindingException FullyQualifiedErrorId : AmbiguousParameterSet,setup2.ps1
Ответ №1:
Это был бы «способ Powershell» для его написания:
param( [switch]$Red, [switch]$Blue, [string]$Target = "none", [string]$Type = "infinite" )
Все очень просто. Вы можете опустить атрибуты «Параметр», если не собираетесь указывать какие-либо значения по умолчанию. Кроме того, для «флагов» или переключателей лучше подходит тип [переключатель], чем bool.
Комментарии:
1. Неплохо. Единственное отличие от приведенного здесь примера perl заключается в том, что этот блок параметров также неявно принимает позиционные аргументы, например,
.script.ps1 -Red some limited
будет привязываться"some"
к$Target
и"limited"
к$Type