AutoHotkey_Lで、Operaの起動と終了を便利にしてみた。

 RamDiskを少しでも活用しようとOperaのキャッシュフォルダを配置して(速度向上は体感できなかったが、HDD寿命的に)満足してたのだが、TL眺めてたら「RamdiskにOpera置いたら爆速」とあって、試してみたら速度向上したので、RunOpera.ahkに組み込んでみた。

 RamDisk起動機能を有効にすると、OperaをRamDiskにコピーして起動し、終了したら元のフォルダにコピーする。監視対象はRunOpera.ahkから起動したOperaのみ。Operaを起動させたままWindowsを終了した場合、Operaが終了するまで待機して元フォルダにコピーしてから終了する……ハズ。
 基本的な使い方は前回を参照。実は他にも地味に機能が増えてるが、普通に使う分には大差ないので省略。

; --------- --------- --------- --------- ---------
; RunOpera.ahk
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := "C:\Program Files\Opera\Opera\"  ; Opera.exeの存在するパスを指定。末尾は"\"。

  SessionsPath := OperaPath "profile\sessions\"  ; セッションフォルダのフルパスを指定。末尾は"\"。
  BookmarksPath := OperaPath "profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。

  RamPath := "R:\Opera\"  ; RamDisk起動時に、Operaのコピー先となるフルパスを指定。末尾は"\"。

  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。

  AutoConvSW := 0  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。

  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  WriteTrgSW := 0  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。

  RamCopySW := 0  ; RamDisk起動の設定。 0:通常起動。 1:コピーして起動し、終了したら書き戻す。
      ; ※ RamDisk起動を利用する場合、Operaはスタンドアロン版であること。

; --------- --------- --------- --------- ---------

  IfNotExist, %SessionsPath%
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    
    Exit
  }
  If (1 == WriteTrgSW) {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      Exit
    }
  }

  IfExist, %SessionsPath%autosave.win
    GoSub, SessionAnalyze

;  FileCopy, %OperaPath%ui\fastforward_backup.ini, %OperaPath%ui\fastforward.ini, 1  ; アップデートのたびにFastForward.iniが初期化される問題の対策。

;  FileCopy, %SessionsPath%autosave_RunOpBak.win, %SessionsPath%autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
;  FileCopy, %SessionsPath%autosave.win, %SessionsPath%autosave_RunOpBak.win, 1

  Process, WaitClose, opera.exe, 60  ; ↓終了させたはずのOperaがゾンビ化してないか確認。
  if ErrorLevel {
    MsgBox, 16, , Operaはすでに起動しています。
    ExitApp
  }

  if RamCopySW {  ; RamCopySWが1なら
    FileCopyDir, %OperaPath%, %RamPath%, 1
    OnExit, ExitOp
    SetTimer, CheckOp, -1000
    RunWait, %RamPath%opera.exe, , , OpPid
  } else {  ; RamCopySWが0なら通常起動
    Run, %OperaPath%opera.exe, , , OpPid
    gosub, CheckOp
  }

ExitApp

; --------- --------- --------- --------- ---------

ExitOp:
  Process, WaitClose, %OpPid%
  FileCopyDir, %RamPath%, %OperaPath%, 1
ExitApp

; --------- --------- --------- --------- ---------

CheckOp:
  WinWait, ahk_pid %OpPid%, , 60
  if !ErrorLevel {
    ifWinExist, Opera へようこそ ahk_pid %OpPid%
    {
      WinActivate
      WinWaitClose
    }
  } else {
    return
  }

  WinWait, パスワード ahk_pid %OpPid%, , 5
  If ErrorLevel
    return

  WinActivate
  Sleep, 300
return

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%autosave.win
  If (0 != ErrorLevel) {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%autosave.win
    Return
  }

  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles := WinTitles " " HisTitle "`n"
  }
  If("" == WinTitles)
    Return

  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%BackupName%
      If(0 == ErrorLevel)
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    If (1 == AutoConvSW)
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    Exit

Return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If (1 == WriteTrgSW)
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%

  CmdLine := SessionsPath BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result

  Idx := 0
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1

    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)

    If (0 == HisReadSW) {  ; タブ履歴を無視する場合
      Result .= "%uRL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }

    StringLen, HisNumLen, HisNum

    If (0 == HisNum) {
      Result .= "%uRL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n%uRL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "%uRL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }

  If (ResultBuf == Result)
    Return
  Result .= "-`n`n"

  If (1 == WriteTrgSW) {
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }

  If (1 == ACMoveSW) {
    IfNotExist, %SessionsPath%AutoConv\
      FileCreateDir, %SessionsPath%AutoConv\
    FileMove, %CmdLine%, %SessionsPath%AutoConv\%BackupName%
    If (0 != ErrorLevel)
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%AutoConv\
  }
Return

; --------- --------- --------- --------- ---------

GetHisTitle(ByRef OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
  Return $1
}

GetHisUrl(ByRef OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
  Return $1
}

ZeroSupply(Num, Digit){
  StringLen, NumLen, Num
  LoopNum := Digit - NumLen
  Loop, %LoopNum%
    Num := "0" Num
  Return, Num
}

 ひょっとしたら、タイミングによってはコピーが不完全なんてことも、ないとは言い切れないので、注意。

 RamDisk全体をバックアップ/レストアするだけでよくね?という正論は受け付けてません><


[PR]
by lordnoesis | 2012-04-15 18:28 | テクノロジ | Trackback | Comments(0)
トラックバックURL : http://poimono.exblog.jp/tb/17827164
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
名前
URL
画像認証
削除用パスワード

※このブログはコメント承認制を適用しています。ブログの持ち主が承認するまでコメントは表示されません。

ブログトップ | ファンになる