卸载模块时还原PowerShell别名

时间:2014-06-29 11:17:23

标签: powershell

如何在卸载模块时恢复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

2 个答案:

答案 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 ''