У меня есть следующая функция PowerShell, которая работает так, как предназначена для использования конвейера и параметров:
function ext {
process {
[System.IO.Path]::ChangeExtension($_ ? $_ : $args[0], $_ ? $args[0] : $args[1])
}
}
Можно ли упростить/минимизировать эту функцию, используя некоторые автоматические переменные, о которых я не знаю, но без удлинения кода.
Я явно не хочу просматривать весь синтаксис параметров, например [Parameter(ValueFromPipeline=$True)], и явно определять каждый параметр, поскольку это удвоит длину функции, что точно не является моей целью, в отличие от этих сообщений:
Я имею в виду, есть ли какая-то автоматическая переменная, о которой я, возможно, не знаю, которая работает по-разному в зависимости от входных параметров конвейера и параметра, которая соответствует моему варианту использования.
вы уже рассмотрели оба случая: конвейер $_ и позиционную привязку $args. Не существует автоматической переменной, которая охватывала бы оба условия в 1. Вы можете использовать $MyInvocation.ExpectingInput ? $_ : $args[0] и то же самое для другого условия, но это только удлинит код.
Хорошо. Спасибо за информацию. filter тоже полезен. :)





Нет, вам нужно включить функцию для получения входных данных конвейера.
А это значит [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])
}
вы можете изменить
functionнаfilterи удалить блокprocess, если хотите меньше кода. До сих пор неясно, что вы подразумеваете под использованием большего количества автоматических переменных? вы уже используете 2 из них, что еще может быть автоматическим?