如何在启动时打开ISE中最后打开的文件

时间:2009-11-12 14:47:40

标签: powershell

我想用posh脚本自动打开ISE中的最后一个opend文件, 所以我试着保存这些文件的文件路径,如下所示。

$action = { $psISE.CurrentPowerShellTab.Files | select -ExpandProperty FullPath | ? { Test-Path $_ } |
Set-Content -Encoding String -Path$PSHOME\psISElastOpenedFiles.txt
Set-Content -Encoding String -Value "Now exiting..." -Path c:\exitingtest.log
}
Register-EngineEvent -SourceIdentifier Exit -SupportEvent -Action $action

当我关闭ISE时,会创建exitingtest.log并且“正在退出...”,  但是没有创建psISElastOpenedFiles.txt。 似乎ISE在执行退出事件之前关闭所有打开的文件。

我应该使用Timer事件吗?

2 个答案:

答案 0 :(得分:3)

当CurrentTabs和Files对象引发CollectionChanged事件时,不保存退出,而是保存MRU信息。这是我正在使用的MRU ISE插件:

# Add to profile
if (test-path $env:TMP\ise_mru.txt)
{
    $global:recentFiles = gc $env:TMP\ise_mru.txt | ?{$_}
}

else
{
    $global:recentFiles = @()
}

function Update-MRU($newfile)
{
    $global:recentFiles = @($newfile) + ($global:recentFiles -ne $newfile) | Select-Object -First 10

    $psISE.PowerShellTabs | %{
        $pstab = $_
        @($pstab.AddOnsMenu.Submenus) | ?{$_.DisplayName -eq 'MRU'} | %{$pstab.AddOnsMenu.Submenus.Remove($_)}
        $menu = $pstab.AddOnsMenu.Submenus.Add("MRU", $null, $null)
        $global:recentFiles | ?{$_} | %{
            $null = $menu.Submenus.Add($_, [ScriptBlock]::Create("psEdit '$_'"), $null)
        }
    }
    $global:recentFiles | Out-File $env:TMP\ise_mru.txt
}

$null = Register-ObjectEvent -InputObject $psISE.PowerShellTabs -EventName CollectionChanged -Action {
    if ($eventArgs.Action -ne 'Add')
    {
        return
    }

    Register-ObjectEvent -InputObject $eventArgs.NewItems[0].Files -EventName CollectionChanged -Action {
        if ($eventArgs.Action -ne 'Add')
        {
            return
        }
        Update-MRU ($eventArgs.NewItems | ?{-not $_.IsUntitled}| %{$_.FullPath})
    }
}

$null = Register-ObjectEvent -InputObject $psISE.CurrentPowerShellTab.Files -EventName CollectionChanged -Action {
    if ($eventArgs.Action -ne 'Add')
    {
        return
    }
    Update-MRU ($eventArgs.NewItems | ?{-not $_.IsUntitled}| %{$_.FullPath})

}

Update-MRU

答案 1 :(得分:1)

几个月前我试图这样做,并发现竞争条件阻止了这种情况在95%的时间内起作用。 ISE的对象模型中的选项卡集合通常在处理powershell.exiting事件之前处理掉。愚蠢,是的。可修复,没有。

-Oisin