Пытаюсь разобраться в PowerShell — функциях, псевдонимах и т. Д

#mysql #windows #powershell #scripting #alias

#git #функция #powershell #псевдоним

Вопрос:

Я опытный программист на C #, но до сих пор я едва разбирался в PowerShell (до сих пор использовал другой альтернативный продукт командной строки Windows).

Я пытаюсь автоматизировать некоторые вещи Git, и я столкнулся с некоторыми трудностями и, похоже, не могу найти никакого решения для них … (и, похоже, ни один видеоурок или сообщение в блоге пока не помогли).

Что я пытаюсь сделать, так это определить функции и псевдонимы, которые сделают мою работу с Git в PowerShell более удобной — и да, я знаю о Posh-Git и тоже проверил его — но, похоже, это связано в основном с представлением приятного пользовательского интерфейса в PowerShell.

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

С чем я сейчас борюсь, так это с этим: я хотел бы иметь псевдоним для git pull (а также git push ), который может либо выполняться просто «как есть» — например, running just git pull , либо который может запускать наиболее частую команду, которую мне нужно использовать — git pull origin master .

Я попытался определить одну функцию:

 function invoke-gitpull { git pull $args }
  

а затем определите для этого два псевдонима — один просто вызывает эту функцию «как есть», другой предоставляет два параметра — вот так:

 Set-Alias gtp invoke-gitpull 
Set-Alias gtpom invoke-gitpull origin master
  

Но почему-то PS это не нравится 🙁

Set-Alias : не удается найти позиционный параметр, который принимает аргумент ‘origin’.
Вызов Set-Alias gtpom-gitpull origin master
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Информация о категории : Неверный аргумент:(:) [Set-Alias], ParameterBindingException
FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Команды.SetAliasCommand

Затем я также попытался определить параметры для invoke-gitpull функции — вот так:

 function invoke-gitpull ([String] $remote, [String] $branch) { git pull $remote $branch }
  

думая, что если я не предоставлю значений параметров, то git pull будет выдано — и если я предоставлю два значения параметров — invoke-gitpull -remote origin -branch master , тогда git pull origin master будет вызван — но опять же, PS не согласен со мной:

Set-Alias : не удается найти параметр, соответствующий имени параметра ‘remote’.
Set-Alias gtpom invoke-gitpull -удаленный источник -мастер ветки
~~~~~~~
CategoryInfo : InvalidArgument: (:) [Set-Alias], ParameterBindingException
FullyQualifiedErrorId : NamedParameterNotFound, Microsoft.PowerShell.Команды.SetAliasCommand

Кроме того, я также попробовал использовать параметры внутри функции:

но я снова получил ту же ошибку.

Итак, КАК мне определить эти параметры для моей invoke-gitpull функции, чтобы это работало? Кажется, я хожу по кругу, не совсем понимая, что я делаю не так ….. кто-нибудь может меня просветить?

Ответ №1:

Псевдонимы (с использованием *-Alias командлетов) ограничены указанием только на имена команд без аргументов. Если вы хотите иметь аргументы для своего псевдонима в качестве другого псевдонима (например, gtp origin master ), вам нужно определить их как функции:

 function invoke-gitpull { git pull $args }
Set-Alias -Name gtp -Value invoke-gitpull
function gtpom { gtp origin master }
  

но если это просто для частного использования, я бы пропустил псевдонимы и просто включил их в $Profile то, как вы их хотите:

 function gtp() { amp; GIT.exe pull @args }
function gtpom() { gtp origin master }
  

Комментарии:

1. Я сделал это — и все работает НОРМАЛЬНО — но я продолжаю получать предупреждения при запуске PS о наличии команд, которые «нелегко обнаружить», поскольку они не используют стандартный синтаксис глагола-существительного……

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

3. @marc_s Вы определяете эти функции / псевдонимы в модуле и импортируете их в свой профиль? Если это так, вы можете подавить поток предупреждений, перенаправив его: ipmo mymodule 3>$null

4. @marc_s Тогда да, это особенность Import-Module командлета. У вас есть три обходных пути: подавить предупреждения с 3>$null помощью , -WarningAction Ignore , или определить функцию (соответствующую глаголам) / комбинацию псевдонимов для каждого нужного псевдонима.

5. @marcs и TheIncorrigible1: обратите внимание, что проверке имени подлежат только функции [импортированные из модулей] — на имена псевдонимов нет ограничений. Кроме того, Import-Module есть специальный -DisableNameChecking переключатель для подавления предупреждения; однако это не поможет вам при импорте модулей с using module ... помощью . Напротив, если модуль загружается автоматически — в силу того, что он помещен в папку, указанную в $env:PSModulePath — предупреждение не отображается.