【问题标题】:Trying to wrap my head around PowerShell - functions, aliases etc试图将我的头脑围绕在 PowerShell 上——函数、别名等
【发布时间】:2018-09-23 14:02:26
【问题描述】:

我是一名经验丰富的 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 }

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

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

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

Set-Alias:找不到接受参数“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不同意我的观点:

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

然后我也尝试使用参数inside函数:

但我又遇到了同样的错误。

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

【问题讨论】:

    标签: git function powershell alias


    【解决方案1】:

    别名(使用*-Alias cmdlet)仅限于指向命令名称​​仅不带参数。如果您希望将别名参数作为另一个别名(例如gtp origin master),则需要将它们定义为函数

    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 }
    

    【讨论】:

    • 我这样做了——而且效果还不错——但是在启动 PS 时,我不断收到警告,说有“不容易发现”的命令,因为它们没有使用标准的动词-名词语法...... ...
    • @marc_s 不幸的是,这是别名的限制,除非您为所需的每个创建函数/别名组合。我不确定如何抑制警告,但当我有可用的 PC 时,我会做一些研究。
    • @marc_s 您是否在模块中定义这些函数/别名并将它们导入您的配置文件?如果是这样,您可以通过重定向来抑制警告流:ipmo mymodule 3>$null
    • @marc_s 那么是的,这是Import-Module cmdlet 的一个功能。您有三种解决方法:使用3>$null-WarningAction Ignore 禁止警告,或为您想要的每个别名定义一个函数(符合动词)/别名组合。
    • @marcs 和 TheIncorrigible1:请注意,只有 functions [从模块导入] 需要进行名称检查 - alias没有限制> 名称。此外,Import-Module 有一个专用的-DisableNameChecking 开关来抑制警告;但是,在使用 using module ... 导入模块时,这对您没有帮助。相反,如果一个模块是自动加载的——由于被放置在$env:PSModulePath中列出的文件夹中——警告将显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2017-09-27
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多