#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
— предупреждение не отображается.