在PowerShell会话之间保留当前目录

时间:2015-08-28 00:25:15

标签: powershell

有没有办法让PowerShell控制台记住上次运行时的当前目录,并将其用作下一个实例的默认位置?

例如。

  • 打开PowerShell控制台
  • Set-Location c:\tmp
  • 关闭PowerShell
  • 打开PowerShell控制台
  • Get-Location返回c:\tmp

3 个答案:

答案 0 :(得分:2)

您可以更改prompt功能以将位置更改保存到用户环境变量:

$Function:prompt = {
    if([System.Environment]::GetEnvironmentVariable("LocationMemory",[System.EnvironmentVariableTarget]::User) -ne $PWD){
        [System.Environment]::SetEnvironmentVariable("LocationMemory",$PWD,[System.EnvironmentVariableTarget]::User)
    }
    "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1))"
}

然后检查环境变量是否存在且在PowerShell启动时是否有效

if(($LastLocation = [System.Environment]::GetEnvironmentVariable("LocationMemory",[System.EnvironmentVariableTarget]::User))){
    if((Test-Path $LastLocation -PathType Container)){
        Set-Location $LastLocation
    }
}

将两个代码段放在您的个人资料中以使其有效。您可能希望将其限制为$Profile.CurrentUserCurrentHost

答案 1 :(得分:2)

我不知道这是否完美,但在我的机器上进行测试似乎有效。首先看看this question/answer,这是锦上添花。您基本上必须通过PowerShell的退出事件记录会话的当前路径。

您可以将此位代码添加到$PROFILE,以便始终注册退出事件,然后设置路径。

Register-EngineEvent PowerShell.Exiting -Action {(Get-Location).Path | Out-File 'C:\Users\wshaw\Documents\WindowsPowerShell\LastPath.txt' -Force}
$lastPath = 'C:\Users\wshaw\Documents\WindowsPowerShell\LastPath.txt'
if (Test-Path $lastPath) {
    Set-Location (Get-Content $lastPath)
}

答案 2 :(得分:1)

感谢@Shawn和@Mathias提供了很好的答案。我最后结合你的方法来得出以下内容:

Register-EngineEvent PowerShell.Exiting -Action {
    Write-Warning "Saving current location"
    [System.Environment]::SetEnvironmentVariable("LocationMemory", (Get-Location).Path, [System.EnvironmentVariableTarget]::User)
} | Out-Null

$lastPath = [System.Environment]::GetEnvironmentVariable("LocationMemory",[System.EnvironmentVariableTarget]::User)

if (($lastPath -ne $null) -and (Test-Path $lastPath)) {
    Set-Location $lastPath
}

调用SetEnvironmentVariable时,我有大约4秒的延迟,这就是我添加Write-Warning的原因(否则您可能会认为退出或点击后控制台窗口没有关闭在关闭窗口控件上)