WedX - журнал о программировании и компьютерных науках

Есть ли способ создать псевдонимы для методов объекта в powershell?

Я обнаружил, что повторяюсь в сценариях powershell в некоторых случаях, когда имеет значение контекст выполнения. Отложенное раскрытие строки — один из таких случаев:

$MyString = 'The $animal says $sound.'

function MakeNoise{ 
   param($animal, $sound)
   $ExecutionContext.InvokeCommand.ExpandString($MyString)
}

PS> MakeNoise pig oink
The pig says oink.

Эта длинная строка ExpandString() часто повторяется. Я бы предпочел, чтобы эта строка была краткой, например:

xs($MyString)
xs $MyString
$MyString | xs

Любой из них будет предпочтительнее. Мои обычные стратегии инкапсуляции в командлетах, кажется, не работают в этом случае, потому что контекст вызова ExpandString() имеет решающее значение.

Итак, мои вопросы:

  1. Есть ли способ создать псевдоним для метода объекта?
  2. Есть ли другой способ кратко вызвать метод объекта, сохраняя при этом контекст вызова?
19.02.2015

  • Почему бы не создать функцию и назвать ее как угодно? 19.02.2015
  • @CB. Поскольку обертывание ExpandString() в функцию изменяет ее контекст, делая расширяемые переменные недоступными для ExpandString(). 20.02.2015

Ответы:


1

Кажется, вам нужен способ отложить оценку $ExecutionContext до тех пор, пока не придет время фактически выполнить расширение строки. Вот один из способов сделать это, реализованный в виде функции:

function xs
{
    [CmdletBinding()]
    param
    (
        [parameter(ValueFromPipeline=$true,
                   Position=0,
                   Mandatory=$true)]
        [string]
        $string
    )
    process
    {
        $code = "`$ExecutionContext.InvokeCommand.ExpandString(`"$string`")"
        [scriptblock]::create($code) 
    }
}

Затем:

&($MyString | xs)
&(xs $MyString)

Блок сценария создается во время выполнения, поэтому $ExecutionContext оценивается для каждого вызова.

20.02.2015
  • Это не работает, если xs реализован в отдельном от $Mystring | xs модуле. 20.02.2015
  • Это похоже на проблему масштаба. Это не исправить. 20.02.2015
  • У меня получилось с небольшими правками. Я обновил ваш ответ (обновление ожидает экспертной оценки). Ваша идея отложить вызов, создав блок сценария для каждой строки, определенно работает. 20.02.2015

  • 2

    Вы можете просто сделать свою собственную функцию для этого

    function xs{
        param(
        [Parameter(Mandatory=$True,ValueFromPipeline=$True)]
        [string]$expand)
        $ExecutionContext.InvokeCommand.ExpandString($expand)
    }
    
    function MakeNoise{ 
       param($animal, $sound)
       $MyString = 'The $animal says $sound.'
       xs $MyString
       # $MyString | xs     <--  would also work
    }
    
    MakeNoise pig oink
    
    19.02.2015
  • Проблема в том, что функция xs полезна только в том случае, если она находится в том же контексте (например, в модуле), что и MakeNoise. В частности, если вы поместите xs в другой модуль, скажем, utility.psm1, а MakeNoise поместите в MakeNoise.ps1, результатом будет The says ., потому что xs находится в контексте, где $animal и $sound не существуют. 20.02.2015
  • У вас будет эта проблема для любой функции или псевдонима. Вы можете определить его как глобальный function global:xs. Никогда не играл с таким количеством, поэтому я не уверен, что это сработает. 20.02.2015
  • Хм... если бы существовал командлет с именем, скажем, Expand-String, который делал то же самое, что и ExpandString(), то вы могли бы установить для него псевдоним xs, и он работал бы так же. Использование псевдонима для вызова функции не изменяет контекст функции так же, как это делает перенос функции в другую функцию. 20.02.2015
  • Если это был вопрос, то ответ - да. Псевдонимы не изменяют функциональность функций/командлетов. Просто уменьшите набор текста и краткость в некоторых случаях. 20.02.2015

  • 3

    Посмотрите на командлет New-Alias ​​— https://technet.microsoft.com/en-us/library/hh849959.aspx

    19.02.2015
  • New-Alias, по-видимому, создает псевдонимы только для командлета, функции, файла сценария или работающей программы. У вас есть пример того, как New-Alias можно использовать для создания псевдонима для метода объекта? 19.02.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]