Вот код, который демонстрирует проблему. Командлет 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
Звучит правдоподобно для меня, хотя я никогда не сталкивался с этой проблемой. В сценариях я никогда не использую позиционные параметры. Я всегда явно перечисляю параметр. Возможно, файл [Ошибка подключения PowerShell] (https://connect.microsoft.com/PowerShell/)? –
Да, я напишу ошибку, я довольно часто плакатный там :) Но это вряд ли ошибка :(Сначала я хочу знать, что думают другие. И, прежде всего, меня интересуют обходные пути. –
@Aaron Дженсен, вы правы, что в * скриптах * это не большая проблема. Но дело в том, что я нашел эту проблему, когда я составлял командную строку в консоли. И другие пользователи * Invoke-Build * могут сталкиваться с тем же проблемы при вводе в командной строке –