试图围绕 PowerShell 思考 - 函数、别名等
Trying to wrap my head around PowerShell - functions, aliases etc
我是一名经验丰富的 C# 程序员,但到目前为止,我几乎没有涉足 PowerShell(到目前为止使用过另一种替代 Windows 命令行产品)。
我正在尝试自动化一些 Git 的东西,但我 运行 遇到了一些困难,似乎找不到解决这些问题的任何方法...(也没有视频教程或博客 post 到目前为止似乎也有很大帮助)。
我想做的是定义函数和别名,使我在 PowerShell 中使用 Git 更舒适 - 是的,我知道 Posh-Git ,也已经检查过了 - 但这似乎主要是为了在 PowerShell 中呈现一个漂亮的 UI。
我想为我一直使用的常用 Git 命令定义 "shortcuts" - 到目前为止已经成功定义了 一些 别名。
我现在正在苦苦挣扎的是:我想要 git pull
(以及 git push
)的别名,可以 运行 "as is" - 例如运行仅 git pull
,或者 运行 我需要使用的最频繁的命令 - git pull origin master
.
我试图定义一个函数:
function invoke-gitpull { git pull $args }
然后为此定义两个别名 - 一个只是调用此函数 "as is",一个提供两个参数 - 如下所示:
Set-Alias gtp invoke-gitpull
Set-Alias gtpom invoke-gitpull origin master
但不知何故,PS 不喜欢这样:-(
Set-Alias : A positional parameter cannot be found that accepts argument 'origin'.
+ Set-Alias gtpom invoke-gitpull origin master
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Alias], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.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 : A parameter cannot be found that matches parameter name 'remote'.
+ Set-Alias gtpom invoke-gitpull -remote origin -branch master
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Alias], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SetAliasCommand
此外,我还尝试在 内部 函数中使用参数:
但我又遇到了同样的错误。
所以 如何 我必须为我的 invoke-gitpull
函数定义这些参数才能工作吗?我似乎在兜圈子,不完全理解我做错了什么.....任何人都可以启发我吗?
别名(使用 *-Alias
cmdlet)仅限于指向命令名称 仅、没有参数。如果您希望将别名的参数作为另一个别名(例如 gtp origin master
),您需要将它们定义为 functions:
function invoke-gitpull { git pull $args }
Set-Alias -Name gtp -Value invoke-gitpull
function gtpom { gtp origin master }
但如果这只是私人使用的东西,我会跳过别名,只将它们包含在您的 $Profile
您想要的方式中:
function gtp() { & GIT.exe pull @args }
function gtpom() { gtp origin master }
我是一名经验丰富的 C# 程序员,但到目前为止,我几乎没有涉足 PowerShell(到目前为止使用过另一种替代 Windows 命令行产品)。
我正在尝试自动化一些 Git 的东西,但我 运行 遇到了一些困难,似乎找不到解决这些问题的任何方法...(也没有视频教程或博客 post 到目前为止似乎也有很大帮助)。
我想做的是定义函数和别名,使我在 PowerShell 中使用 Git 更舒适 - 是的,我知道 Posh-Git ,也已经检查过了 - 但这似乎主要是为了在 PowerShell 中呈现一个漂亮的 UI。
我想为我一直使用的常用 Git 命令定义 "shortcuts" - 到目前为止已经成功定义了 一些 别名。
我现在正在苦苦挣扎的是:我想要 git pull
(以及 git push
)的别名,可以 运行 "as is" - 例如运行仅 git pull
,或者 运行 我需要使用的最频繁的命令 - git pull origin master
.
我试图定义一个函数:
function invoke-gitpull { git pull $args }
然后为此定义两个别名 - 一个只是调用此函数 "as is",一个提供两个参数 - 如下所示:
Set-Alias gtp invoke-gitpull
Set-Alias gtpom invoke-gitpull origin master
但不知何故,PS 不喜欢这样:-(
Set-Alias : A positional parameter cannot be found that accepts argument 'origin'.
+ Set-Alias gtpom invoke-gitpull origin master
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Alias], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.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 : A parameter cannot be found that matches parameter name 'remote'.
+ Set-Alias gtpom invoke-gitpull -remote origin -branch master
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Alias], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SetAliasCommand
此外,我还尝试在 内部 函数中使用参数:
但我又遇到了同样的错误。
所以 如何 我必须为我的 invoke-gitpull
函数定义这些参数才能工作吗?我似乎在兜圈子,不完全理解我做错了什么.....任何人都可以启发我吗?
别名(使用 *-Alias
cmdlet)仅限于指向命令名称 仅、没有参数。如果您希望将别名的参数作为另一个别名(例如 gtp origin master
),您需要将它们定义为 functions:
function invoke-gitpull { git pull $args }
Set-Alias -Name gtp -Value invoke-gitpull
function gtpom { gtp origin master }
但如果这只是私人使用的东西,我会跳过别名,只将它们包含在您的 $Profile
您想要的方式中:
function gtp() { & GIT.exe pull @args }
function gtpom() { gtp origin master }