Перевести конструкцию NDesk.Options.OptionSet в PowerShell - PullRequest
0 голосов
/ 04 ноября 2011

Ниже приведен типичный 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, если это вообще возможно.Нет связи с анализом аргументов командной строки.Просто чистый поиск знаний.

1 Ответ

4 голосов
/ 04 ноября 2011

PowerShell имеет свой собственный синтаксический анализатор / связыватель параметров / параметров для функций и командлетов.Вы не можете переопределить это с NDesk.Options, так что вы здесь на ветру, я боюсь, мой хороший человек.Прежде чем сказать «черт возьми, это отстой», вы должны немного подумать о больших целях PowerShell.При использовании встроенного связывателя параметров стили вызова функций / команд являются инвариантными: не удивительно, если это косая черта или дефис, двойная косая черта, равно, двоеточие и т. Д. Это та же самая причина, почему командлеты и функции используют знакомую запись глагола-существительного в именовании,Вместо того, чтобы гадать, как вызывать вещи и неправильно их понимать, вы можете приступить к более полезной деятельности - выяснить, что вы можете сделать.

Чего вы пытаетесь достичь в более широкой перспективе?Опубликуйте необходимую семантику привязки параметров, и я покажу вам, как объявить это в функции powershell.

Обновление : если вы хотите узнать больше о powershell, прочитайте моего хорошего другаБесплатная электронная книга Кейта Хилла: эффективная оболочка Windows PowerShell, доступная бесплатно в формате PDF: http://rkeithhill.wordpress.com/2009/03/08/effective-windows-powershell-the-free-ebook/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...