目前,我正在编写一个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
}
答案 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
}
}
}