Преобразуйте функции GetOptions perl в эквивалентную инструкцию Powershell param

#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