Ниже приведен типичный OptionSet
код конструкции:
var p = new OptionSet {
{ "h|help", "Show this help", v => { isHelp = (v != null); } },
};
var extra = p.Parse(args);
Моя версия Powershell того же кода:
$p = New-Object NDesk.Options.OptionSet
$p.Add("h|help", "Show this help", { param([string]$v) $global:isHelp = $true })
$extra = $p.Parse($args)
К сожалению, у него есть две проблемы.Когда я выполняю вторую строку, я получаю это:
Multiple ambiguous overloads found for "Add" and the argument count: "3".
At C:\Work\hg\utils\HgTagPromotedBuild.ps1:62 char:7
+ $p.Add <<<< ("h|help", "Show this help message", { param([string]$v) $global:isHelp =
$true })
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
, а затем выполнение следующей строки приводит к:
Cannot convert argument "0", with value: "System.Object[]", for "Parse" to type "System
.Collections.Generic.IEnumerable`1[System.String]": "Cannot convert the "System.Object[
]" value of type "System.Object[]" to type "System.Collections.Generic.IEnumerable`1[Sy
stem.String]"."
At C:\Work\hg\utils\HgTagPromotedBuild.ps1:63 char:18
+ $extra = $p.Parse <<<< ($args)
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
Соответствующая часть объявления OptionSet
:
public OptionSet Add(Option option);
public OptionSet Add(string prototype, OptionAction<string, string> action);
public OptionSet Add<TKey, TValue>(string prototype, OptionAction<TKey, TValue> action);
public OptionSet Add<T>(string prototype, Action<T> action);
public OptionSet Add(string prototype, Action<string> action);
public OptionSet Add<TKey, TValue>(string prototype, string description, OptionAction<TKey, TValue> action);
public OptionSet Add(string prototype, string description, OptionAction<string, string> action);
public OptionSet Add<T>(string prototype, string description, Action<T> action);
public OptionSet Add(string prototype, string description, Action<string> action);
Я вообще не понимаю, что происходит с первой ошибкой.
Второе ясно: очевидно, $args
напечатано как object[]
, в то время как OptionSet.Parse
ожидает IEnumerable<string>
, но я не могу найти способ приведения к string[]
.
.мой вопрос: как мне перевести оригинальный код C # в Powershell без этих неприятных исключений?
Спасибо.
РЕДАКТИРОВАТЬ
Спасибо всемребята, которые дали мне понять, что PowerShell имеет четко определенную методологию для работы с аргументами командной строки.Я признал этот факт и даже создал специальный вопрос SO - Существует ли приличный анализатор командной строки для powershell? , который я уже отметил как ответивший.Еще раз, спасибо всем.
Теперь мне все еще интересно узнать, как я могу вызвать конкретный код .NET из PowerShell, если это вообще возможно.Нет связи с анализом аргументов командной строки.Просто чистый поиск знаний.