如何在卸载模块时恢复PowerShell别名。
尽管执行Set-Alias
命令本身,但到目前为止我的代码不起作用。它将定义存储在局部变量中,该变量在OnRemove
事件被触发时可用。
$orig_cd = (Get-Alias -Name 'cd').Definition
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
Set-Alias -Name 'cd' -Value $orig_cd -Force -Option AllScope -Scope Global
}
我还应该提一下,我正在覆盖现有的cd命令别名,如此
Set-Alias -Name cd -Value cdX -Force -Option AllScope -Scope Global
以下是模块https://github.com/vincpa/z/blob/master/z.psm1
的源代码在OnRemove处理程序中添加Write-Host
命令,表明$orig_cd
的值确实为Set-Location
。
答案 0 :(得分:4)
我尝试了这个,它有效:
$orig_cd = (Get-Alias -Name 'cd').Definition
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
set-item alias:cd -value $orig_cd
}
Set-item alias:cd -Value 'cdX'
另外,一个建议 - 你正在写一个人们将在他们的终端中使用的模块。我不希望某个用户想删除你的模块的用例。对于您正在编写的模块,这些步骤可能过度。
答案 1 :(得分:1)
虽然about_scopes有点令人困惑,但Alias Provider似乎有关键。
别名的范围已为AllScope
,这意味着子范围具有副本/访问权限。您所要做的就是改变价值。
查看-Options
- http://technet.microsoft.com/en-us/library/hh849938.aspx
Set-Alias
- AllScope:别名被复制到任何新范围内。
#Override the existing CD command with the wrapper in order to log 'cd' commands.
Set-Item alias:cd -Value 'cdx'
Set-Alias -Name pushd -Value pushdX -Force -Option AllScope -Scope Global
$orig_cd = (Get-Alias -Name 'cd')
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
set-item alias:cd -value 'set-content'
}
Export-ModuleMember -Function z, cdX, pushdX -alias ''