为什么上游命令多次调用SO?

时间:2018-04-09 00:42:19

标签: powershell

目前,我正在编写一个PowerShell模块,该模块会自动为所有git命令配置别名,灵感来自git-sh

然后我写了下面的函数 Enable-GitAliases函数是自动配置别名的入口点 它通过Get-GitCommands收集git的子命令,它解析git --help -a以获取所有git的子命令。
然后它定义了收集的git命令的包装函数。

我的问题是:为什么git --help -a在调用Enable-GitAliases时被调用了很多次(可能无限次),导致显着减速?

编写代码后,我发现Enable-GitAliases需要花费太多时间(我从未见过它)。
根据任务管理器,git --help -a命令启动并重复退出 我希望git --help -a命令只被调用一次 实际上,Get-GitCommands | % { echo $_ }只拨打git --help -a一次 有什么区别,什么是最好的修复方法?

function Get-GitCommands {
  -Split (git --help -a | select-string -pattern '^  [-a-zA-Z0-9.]+\s*')
}

function Enable-GitAliases($avoidConflicts = $true) {
  Get-GitCommands | % {
    $aliasName = $_
    if (-not ($avoidConflicts -and (Get-Command $aliasName 2> $null) -ne $null)) {
      Enable-GitAliases $aliasName
    }
  }
}

function Enable-GitAlias($commandName) {
  $wrapper = @'
    function global:{0} {{
      git {0} $args
    }}
'@ -f $commandName
  Invoke-Expression $wrapper
}

1 个答案:

答案 0 :(得分:3)

你递归地调用Enable-GitAliases,但是这是打算吗?

你的意图是这个吗?

function Enable-GitAliases($avoidConflicts = $true) {
  Get-GitCommands | % {
    $aliasName = $_
    if (-not ($avoidConflicts -and (Get-Command $aliasName 2> $null) -ne $null)) {
      # Enable-GitAliases -> Enable-GitAlias
      Enable-GitAlias $aliasName
    }
  }
}