Упростите однострочную функцию Powershell, которая работает как с конвейерами, так и с обычными параметрами

У меня есть следующая функция PowerShell, которая работает так, как предназначена для использования конвейера и параметров:

function ext { 
  process {
    [System.IO.Path]::ChangeExtension($_ ? $_ : $args[0], $_ ? $args[0] : $args[1])
  }
}

Можно ли упростить/минимизировать эту функцию, используя некоторые автоматические переменные, о которых я не знаю, но без удлинения кода.

Я явно не хочу просматривать весь синтаксис параметров, например [Parameter(ValueFromPipeline=$True)], и явно определять каждый параметр, поскольку это удвоит длину функции, что точно не является моей целью, в отличие от этих сообщений:

вы можете изменить function на filter и удалить блок process, если хотите меньше кода. До сих пор неясно, что вы подразумеваете под использованием большего количества автоматических переменных? вы уже используете 2 из них, что еще может быть автоматическим?

Santiago Squarzon 13.06.2024 14:37

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

Dmitrij Drandarov 13.06.2024 14:58

вы уже рассмотрели оба случая: конвейер $_ и позиционную привязку $args. Не существует автоматической переменной, которая охватывала бы оба условия в 1. Вы можете использовать $MyInvocation.ExpectingInput ? $_ : $args[0] и то же самое для другого условия, но это только удлинит код.

Santiago Squarzon 13.06.2024 15:02

Хорошо. Спасибо за информацию. filter тоже полезен. :)

Dmitrij Drandarov 13.06.2024 15:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нет, вам нужно включить функцию для получения входных данных конвейера. А это значит [CmdletBinding()] и все остальное.

Ответ принят как подходящий

Единственное возможное упрощение вашего текущего кода — это использование фильтра вместо function с process и удаление System из System.IO.Path. Не существует автоматической переменной, которая бы охватывала конвейерную и позиционную привязку как в версии 1.

filter ext { [IO.Path]::ChangeExtension($_ ? $_ : $args[0], $_ ? $args[0] : $args[1]) }

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

filter ext {
    [IO.Path]::ChangeExtension(
        $MyInvocation.ExpectingInput ? $_ : $args[0],
        $MyInvocation.ExpectingInput ? $args[0] : $args[1])
}

Другие вопросы по теме