Расширьте функциональность CD, сохранив переключатели Set-Location - PullRequest
1 голос
/ 01 марта 2020

Я хочу расширить функциональность cd, но сохранить все существующие параметры Set-Location. Поэтому я создал функцию go, которая делает кучу дополнительных вещей, а затем наложил на нее псевдоним cd (мне пришлось использовать -Option AllScope, чтобы заставить это работать, кто-нибудь знает, почему я не могу просто переименовать CD без использования этого?)

Set-Alias cd go -Option AllScope

Проблема в том, что я хотел бы, чтобы go делал определенные вещи, но также переключал на функциональность Set-Location всякий раз, когда вызывается стандартный переключатель Set-Location:

Set-Location -LiteralPath <String> [-PassThru] [-UseTransaction] [<CommonParameters>]

Set-Location [[-Path] <String>] [-PassThru] [-UseTransaction] [<CommonParameters>]

Set-Location [-PassThru] [-StackName <String>] [-UseTransaction] [<CommonParameters>]

Ищете совета по расширению функциональности встроенного командлета путем создания вторичной функции и последующего повторного использования встроенного псевдонима? то есть я хочу, чтобы cd продолжал выполнять все функции Set-Location, за исключением случаев, когда новые переключатели, которые я хочу, применяются к вторичной функции, к которой теперь добавлен псевдоним?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Как Майк Sh услужливо советует , прокси-функция (функция-обертка) - это путь к go:

  • Создайте свою функцию go в качестве прокси-функции (оболочки) (или сценария) для командлета Set-Location, как показано в этого ответа .

  • Добавление пользовательских функций непосредственно в эту оболочку function.

go - это единственная функция, которая обеспечивает как Set-Location функциональность, так и желаемую пользовательскую функциональность, поэтому достаточно Set-Alias cd go -Option AllScope.

Важно : Так как вы изменяете встроенный псевдоним в сеансе, убедитесь, что ваша go функция является истинным расширенным набором функциональности Set-Location; то есть убедитесь, что он не изменяет и не ограничивает исходное поведение - в противном случае сторонний код может работать неправильно.


Мне пришлось использовать -Option AllScope, чтобы заставить это работать, Кто-нибудь знает, почему я не могу просто повторно использовать псевдоним CD без этого?

Встроенный псевдоним cd определяется как -Option AllScope; любой псевдоним, определенный таким образом, может быть изменен только в том случае, если в повторно указано с помощью Set-Alias.

, снова указывается
. Причина в том, что -Option AllScope означает, что псевдоним автоматически присутствует в любой области, что фактически означает, что указанное определение применяется для всей сессии .

без -Option AllScope, Set-Alias создает / изменяет псевдоним только в области single - которая является либо областью current по умолчанию, либо целью, для которой задан необязательный параметр -Scope - хотя все потомки Области этой области видят определение тоже.

Это противоречит ранее существовавшему определению -Option AllScope для данного имени псевдонима, поэтому PowerShell предоставляет вам два варианта разрешения противоречия:

  • Измените существующее определение AllScope, о котором вы должны сообщить, указав -Option AllScope как часть переопределения , что, очевидно, означает, что вы изменяете в масштабе сеанса д определение псевдонима.

  • Удалить существующее AllScope определение с Remove-Alias (что не желательно, особенно с встроенный псевдонимы), который затем позволяет вам создать псевдоним области действия c псевдоним (с помощью пропуск -Option AllScope).

Обратите внимание, что если вы создаете псевдоним без -Option AllScope, но в области global (например, через файл $PROFILE или с -Scope Global), эффект будет похожи на -Option AllScope, учитывая, что потомки видят также определение, а все области являются потомками глобальной области видимости (включая модули) [1 ] .

Однако любая область-потомок может переопределить глобальное определение.


[1] Технически возможно создать области не связан с глобальной областью действия, но этот вариант малоизвестен и редко используется на практике.

1 голос
/ 01 марта 2020

его вызываемая функция прокси см. сообщение в блоге

...