2014-08-29 2 views
6

Вот код, который демонстрирует проблему. Командлет Set-Location имеет динамический переключатель ReadOnly, если поставщик FileSystem.Динамические переключатели до позиционных параметров могут не работать должным образом

# provider that does not have the dynamic -ReadOnly 
Set-Location env: 

# case 1: works because we explicitly specify FileSystem 
Get-ChildItem C:\ -ReadOnly 

# case 2: fails even though we explicitly specify FileSystem 
Get-ChildItem -ReadOnly C:\ 

Обычно положение параметра переключателя в команде не имеет значения. Это не корпус для динамического переключателя. Случай 2 выходит из строя с ошибкой:

Get-ChildItem : A parameter cannot be found that matches parameter name 'ReadOnly'. 

Что происходит? Я думаю, что в момент создания динамических параметров еще не известно, что ReadOnly является коммутатором. Таким образом, PowerShell рассматривает его как обычный параметр с его аргументом C:\ и C:\, поэтому он не рассматривается как позиционный параметр. В результате Get-ChildItem считает, что местоположение не указано и использует текущий env:. Провайдер Environment делает , не предоставляя динамический переключатель ReadOnly, так что, наконец, команда завершается ошибкой из-за неправильного синтаксиса, хотя она несколько правильная (ту же команду работает, если текущий провайдер FileSystem).

Вопросы:

  • ли мое понимание проблемы правильно?
  • Является ли эта функция документированной где-то?
  • Есть ли обходной путь?

Последний вопрос - это больше о разработке пользовательских команд с динамическими параметрами. Проблема первоначально была замечена и описана как Invoke-Build Issue #4. На данный момент эта проблема только что задокументирована. Но меня все еще интересуют обходные пути.


Выводы

  • Описанная проблема существует.
  • Это не документировано как таковое.
  • Способы работа вокруг, каждый решает эту проблему:
    • Specify динамических ключей после аргументов позиционных параметров
    • Укажите динамические аргументы переключателя в явном виде: -ReadOnly:$true
    • Не используйте позиционные параметры вместе с динамическими коммутаторами, то есть указать параметр имена.

Открыли ошибка: 960194

+1

Звучит правдоподобно для меня, хотя я никогда не сталкивался с этой проблемой. В сценариях я никогда не использую позиционные параметры. Я всегда явно перечисляю параметр. Возможно, файл [Ошибка подключения PowerShell] (https://connect.microsoft.com/PowerShell/)? –

+0

Да, я напишу ошибку, я довольно часто плакатный там :) Но это вряд ли ошибка :(Сначала я хочу знать, что думают другие. И, прежде всего, меня интересуют обходные пути. –

+0

@Aaron Дженсен, вы правы, что в * скриптах * это не большая проблема. Но дело в том, что я нашел эту проблему, когда я составлял командную строку в консоли. И другие пользователи * Invoke-Build * могут сталкиваться с тем же проблемы при вводе в командной строке –

ответ

3

Ваше понимание точно.

Связующий параметр не документирован, так как он чрезвычайно сложный. Спецификация языка (http://www.microsoft.com/en-us/download/details.aspx?id=36389) - это, возможно, лучшая документация, которую мы имеем, но она неполна, и я не думаю, что она охватывает эту ситуацию.

Единственным обходным решением, о котором я могу думать, является указание аргумента параметра переключателя, например.

Get-ChildItem -ReadOnly:$true C:\ 

Не стесняйтесь, чтобы открыть ошибку. Вероятно, он не будет исправлен, но, по крайней мере, дает команде возможность обсудить это.

Я бы предположил, что исправление будет чем-то вроде «если сбой привязки параметров и существуют динамические параметры, вернитесь назад и предположите, что неизвестные параметры являются параметрами переключения и повторите попытку». Это может быть сделано одним неизвестным параметром за раз, или все сразу, в любом случае, привязка параметра может быть очень медленной, если есть много неизвестных параметров.

+0

Благодарим вас за подробный ответ. Я открою ошибку, хотя она не будет исправлена. Исправление не так просто. Например, привязка параметров может не завершиться (например, в примере), но позиционированные аргументы могут быть проглочены/сдвинуты вместо (как в ссылке). –

Смежные вопросы