Смущен тем, почему PowerShell обрабатывает функцию, отличную от дочернего элемента, даже если тот же тип

Меня смущает разница между этими двумя вещами:

$env:path

И

function path {$env:path}
path

Обе возвращаемые строки, согласно get-member. Тем не менее -match не работает одинаково на обоих.

Если я использую -match для $env:path, он работает так, как я и ожидал, возвращая true/false. Но если я использую -match для пути (новая функция), он всегда возвращает путь, игнорируя -match.

Я запутался, потому что обе возвращаемые строки и, следовательно, должны работать одинаково. Нужно ли функции делать что-то особенное, чтобы получить тот же результат?


person scobi    schedule 24.01.2010    source источник


Ответы (2)


Дэвид прав. Разница в том, что -match рассматривается как параметр функции пути. Так,

$(path) -match "foo"

or

(path) -match "foo" 

одинаково хорошо работает. Первое — это подвыражение, второе — вложенный конвейер (обычно в подобных случаях тот же эффект, но есть небольшие различия).

Проверять:

ps> function path {$env:path; write-host "parameters: $args"}
ps> path -match "foo"
(env:path expanded)
parameters: -match foo

-Ойсин

person x0n    schedule 24.01.2010
comment
Привет, Ойсин, ты знаешь Кита Хилла по работе с Powershell? Я работал с ним, пока в прошлом году меня не уволили из Agilent. - person David Gladfelter; 25.01.2010
comment
Да, я делаю Дэвида. Я работаю с ним над несколькими проектами OSS (например, PSCX) и увижу его лично в Редмонде, штат Вашингтон, через несколько недель. - person x0n; 25.01.2010
comment
Отличный ответ, спасибо. Когда я учусь, $() и () продолжают сбивать меня с толку. - person scobi; 25.01.2010
comment
Кстати, в чем тонкая разница между подвыражением и вложенным конвейером? - person scobi; 25.01.2010
comment
Ключевые слова (в отличие от команд) не могут появляться в качестве первого элемента в конвейере, но могут быть в подвыражениях. Пример: (if ($true) { ok }) =› ошибка, но: $(if ($true) { ok }) =› ok - person x0n; 25.01.2010
comment
кроме того, подвыражение $(@(1)) представляет собой одиночное целое число, а (@(1)) представляет собой массив объектов[]. - person x0n; 25.01.2010
comment
Рад слышать, что ему снова удалось организовать поездку в Редмонд. В прошлом Agilent воздерживалась от оплаты его поездок. - person David Gladfelter; 25.01.2010

Вы пробовали что-то вроде

$(путь) - совпадение

Я здесь на Ubuntu, поэтому не могу проверить. $() вызывает оценку выражения, а затем я считаю, что -match должен работать с возвращаемой строкой.

Причина, по которой я предлагаю это, заключается в том, что мне кажется, что если вы не поместите вызов функции в оценщик выражений, -match может рассматриваться как параметр функции пути и игнорироваться, поскольку функция пути не знает о -матч.

person David Gladfelter    schedule 24.01.2010