试图将我的头脑围绕 PowerShell - 函数、别名等

mar*_*c_s 1 git powershell alias function

我是一名经验丰富的 C# 程序员,但到目前为止,我几乎没有涉足 PowerShell(到目前为止,我使用了另一个替代的 Windows 命令行产品)。

我正在尝试自动化一些 Git 的东西,但我遇到了一些困难,似乎找不到任何解决方案......(到目前为止,似乎也没有视频教程或博客文章有很大帮助) .

我想要做的是定义函数和别名,使我在 PowerShell 中使用 Git 更加舒适 - 是的,我知道Posh-Git,并且已经检查过它 - 但这似乎主要处理呈现PowerShell 中的漂亮 UI。

我想为我一直使用的常见 Git 命令定义“快捷方式” - 并且到目前为止已经成功定义了一些别名。

我现在正在苦苦挣扎的是:我想要git pull(以及git push)的别名,它可以“按原样”运行 - 例如只运行git pull,或者可以运行我需要的最频繁的命令使用 - git pull origin master

我试图定义一个函数:

function invoke-gitpull { git pull $args }
Run Code Online (Sandbox Code Playgroud)

然后为此定义两个别名——一个只是“按原样”调用这个函数,一个提供两个参数——像这样:

Set-Alias gtp invoke-gitpull 
Set-Alias gtpom invoke-gitpull origin master
Run Code Online (Sandbox Code Playgroud)

但不知何故,PS 不喜欢这样:-(

Set-Alias:找不到接受参数“origin”的位置参数。
+ 设置别名 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 }
Run Code Online (Sandbox Code Playgroud)

认为如果我不提供参数值git pull则将发出 - 如果我提供两个参数值 - invoke-gitpull -remote origin -branch mastergit pull origin master则将被调用 - 但同样,PS 不同意我的观点:

Set-Alias : 找不到与参数名称“remote”匹配的参数。
+ Set-Alias gtpom invoke-gitpull -remote origin -branch master
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Alias], ParameterBindingException
+fullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SetAliasCommand

此外,我还尝试在函数内部使用参数:

但我又犯了同样的错误。

那么我必须如何为我的invoke-gitpull函数定义这些参数才能使其工作?我似乎在兜圈子,不完全理解我做错了什么......任何人都可以启发我吗?

The*_*le1 5

别名(使用*-Alias小命令)被限制为点命令名不带参数。如果您希望将别名的参数作为另一个别名(例如gtp origin master),则需要将它们定义为函数

function invoke-gitpull { git pull $args }
Set-Alias -Name gtp -Value invoke-gitpull
function gtpom { gtp origin master }
Run Code Online (Sandbox Code Playgroud)

但如果这只是私人用途,我会跳过别名,只需将它们包含在您$Profile想要的方式中:

function gtp() { & GIT.exe pull @args }
function gtpom() { gtp origin master }
Run Code Online (Sandbox Code Playgroud)

  • @marcs 和 TheIncorrigible1:请注意,只有 _functions_ [从模块导入] 受名称检查的约束 - 对 _alias_ 名称没有限制。此外,`Import-Module` 有一个专用的 `-DisableNameChecking` 开关来抑制警告;但是,当使用 `using module ...` 导入模块时,这对你没有帮助。相比之下,如果模块是 _auto_-loaded - 由于被放置在 `$env:PSModulePath` 中列出的文件夹中 - 警告不会_显示。 (2认同)