当Powershell进入新目录时运行命令

时间:2014-04-08 09:30:22

标签: powershell

我希望每当Powershell进入一个新目录时自动运行一个命令(我的关键是检查我是否在Python virtualenv并且如果我正在激活它,但我可以想象其他用途 - 我正在尝试移植https://github.com/kennethreitz/autoenv到Powershell。)

我该怎么做?到目前为止,我已经想到了几个选项,但它们并不理想:

  1. 在我的提示功能中添加一个检查以查看目录是否已更改。我最大的问题是它会增加我的提示(我宁愿避免)的开销,并且它会做很多不必要的检查,因为我不经常更改目录。
  2. 覆盖Set-Location cmdlet。我认为这就是PSCX所做的,但它只会影响cd别名。所以它可能是不完整的(还有Push-Location,以及任何其他用户定义的东西)。此外,它不适用于Powershell启动的目录(由快捷方式设置,而不是Set-Location命令)。
  3. 我希望有一个引擎事件或类似的东西,但我看不到一个。此外,事件处理程序作为后台任务运行,可能不起作用(我没有测试过)。
  4. 我错过了更好的选择吗?或者有没有人对如何有效地实现这一点有任何建议?

2 个答案:

答案 0 :(得分:0)

我会这样做:覆盖cd别名 一个糟糕的例子可能是

function set-env{
    param(
        [Parameter(Position=0, Mandatory=$true,ValueFromPipeline = $true)] $path
        )

    set-location $path
    # stupid test
    if ($path -match "temp"){
        echo "warning this is a temporary dir"
    }
}

Remove-Item -path alias:cd -ea silentlycontinue  
new-item -Path alias:cd -Value set-env |out-null


cd c:\temp\

答案 1 :(得分:0)

我所知道的最佳解决方案是修改提示功能。这就是posh-git的工作原理,虽然它对于posh-git是有意义的,因为当你改变回购时它们实际上会改变提示。

您可以尝试为Set-Location和Push-Location创建代理函数,但那些通常无法工作,因为任何函数都可以通过调用API而不是使用这些命令来更改目录,类似于PSCX的工作方式(使用cmdlet Set-LocationEx。)