よく使うフォルダ
提供:MeryWiki
quickaccess_readme.txt
// 2012/11/21
// 2012/12/19
// 2013/02/23
1.動作
・ポップアップメニューにあらかじめ登録したフォルダの一覧を表示し、エクスプローラーで開く。
2.使い方
・マクロを実行するとこのマクロのあるフォルダに登録用ファイル(quickaccess.txt)が作成されます。
・登録用ファイルに、フォルダパスとポップアップメニューに表示する内容とを”>>”で区切って、1件1行で書いてください。
・フォルダパスは絶対パスで、”\”で終わっている必要があります。
・ポップアップメニューに表示する内容がないときは、フォルダパスを表示します。
・複数の”>>”があるときは、最後の部分のみが表示されます。つまり、例1と例2は同じ表示になります。
(例1)C:\Program Files (x86)\Mery\>>Meryのフォルダ
(例2)C:\Program Files (x86)\Mery\>>ほげ>>ほげ>>Meryのフォルダ
3.その他
・Mery 2.0.11.3997、Windows7 x64 Home sp1 で作成しました。
[更新履歴]
2012/12/19
・すでにフォルダが開かれているときは、新しく開かずにアクティブになるようにしました。
→ tasklist の結果を保存するため、quickaccess.logというファイルを作成します。
→ ウィンドウタイトルが得られないケースがあるので不完全です。
・関数の入れ替え・追加・変更。
2013/02/23
・ファイルオープン時の定数指定の誤りを修正。
// quickaccess.js // 2012/11/21 // 2012/12/19 var file_FullName = changeExt( ScriptFullName, "txt" ); var file_Name = file_FullName.split( "\\" ).pop(); var WshShell = new ActiveXObject( "WScript.Shell" ); var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); // ファイルを開く。 // 第2引数:オープンモード。 // 第3引数:ファイルが存在しなかったとき。 // 第4引数:開くファイルの形式。 // TRISTATE_TRUE:Unicode // TRISTATE_FALSE:ASCII // TRISTATE_USEDEFAULT:システムデフォルト var openMode = { FORREADING: 1, FORWRITING: 2, FORAPPENDING: 8 }; var create = { YES: true, NO: false } var format = { TRISTATE_TRUE: -1, TRISTATE_FALSE: 0, TRISTATE_USEDEFAULT: -2 }; var objFile = objFso.OpenTextFile( file_FullName, openMode.FORREADING, create.YES, format.TRISTATE_FALSE ); // 一行ずつ読み込んで配列に。 var folderAry = []; while ( !objFile.AtEndOfStream ){ folderAry.push( objFile.ReadLine() ) } // 読み終わったファイルを閉じる。 objFile.Close(); var offset = 10; // 固定メニュー数の上限。 var reg = new RegExp( "^[a-zA-Z]:\\\\(.+\\\\)*$" ); // フォルダを表す正規表現のつもり。 var menu = CreatePopupMenu(); var submenu = CreatePopupMenu(); for ( var i in folderAry ){ // “>>”でフォルダパスと表示名に分離。 var item = folderAry[ i ].split( ">>" ); item_0 = item[ 0 ]; item_1 = item.slice ( -1 ); if ( reg.test( item_0 ) ){ menu.Add( item_1, +i + offset, 0 ); } } menu.Add( "-------", 0, meMenuSeparator ) menu.Add( "このドキュメントのフォルダ", 1, 0 ) menu.Add( "ユーザーフォルダ", 2, 0 ) menu.Add( "-------", 0, meMenuSeparator ) menu.AddPopup( "設定", submenu ); submenu.Add( "フォルダの追加", 3, 0 ); submenu.Add( file_Name + "を開く", 4, 0 ); var r = menu.Track( mePosMouse ); switch( r ){ case 0: break; case 1: WshShell.Run( 'explorer "' + Document.path + '"' ); break; case 2: var folder_user = WshShell.SpecialFolders( "Desktop" ).replace( "Desktop","" ) WshShell.Run( 'explorer "' + folder_user + '"' ); break; case 3: path = ( document.path == "" )? getPath( Editor.FullName ): document.path; var input = prompt( "フォルダパス(>>表示名)を入力してください。", path + ">>" ) if ( input != "" ){ var objFile = objFso.OpenTextFile( file_FullName, openMode.FORAPPENDING, create.YES, format.TRISTATE_FALSE ); objFile.WriteLine( input ); objFile.close(); } break; case 4: if ( !isOpened( file_FullName ) ){ Editor.NewFile(); Editor.Documents.Item( editor.Documents.Count-1 ).Activate(); } Editor.OpenFile( file_FullName ); break; default : if ( r >= offset ){ var folderName = folderAry[ r-offset ].split( ">" )[ 0 ]; var pid = isFolderOpened( folderName ); if ( pid == -1 ){ WshShell.Run( 'explorer "' + folderName + '"' ) }else{ WshShell.AppActivate( pid ) }; } } objFile = null; objFso = null; WshShell = null; // “filefullname”をエディタで開いていれば“true”。 function isOpened( filefullname ){ var result = false; for ( var i = Editor.Documents.Count-1; i>=0; i-- ){ result = ( result || Editor.Documents.Item( i ).FullName.toUpperCase() == filefullname.toUpperCase() ); } return result; } // ファイルのパス部分を返す。 function getPath( file_FullPath ){ var ary = file_FullPath.split( "\\" ); ary.pop(); return ary.join( "\\" ) + "\\"; } function isFolderOpened( str ){ var stdout_log = changeExt( ScriptFullName, "log" ); var cmd = 'cmd /c tasklist /fi "imagename eq explorer.exe" /fo csv /v > "' + stdout_log + '"'; var WshShell = new ActiveXObject( "WScript.Shell" ); var windowStyle = { HIDE: 0, NORMALFOCUS: 1 }; WshShell.Run( cmd, windowStyle.HIDE, true ); WshShell = null; var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( !objFso.FileExists( stdout_log ) ){ Quit() } var objFile = objFso.OpenTextFile( stdout_log, openMode.FORREADING, create.NO, format.TRISTATE_FALSE ); var ary = []; while ( !objFile.AtEndOfStream ){ ary.push( objFile.ReadLine() ) } objFile.Close(); objFile = null; objFso = null; for ( var i = 0; i < ary.length; i++ ){ var item = ary[ i ].split( "," ).pop().replace( /\"/ig, "" ) + "\\"; if ( item.toUpperCase() == str.toUpperCase() ){ return ary[ i ].split( "," )[ 1 ].replace( /\"/ig, "" ) } } return -1; } // 拡張子の変更 function changeExt( filename, ext ){ var s = filename.split( "\\" ); var f = s.pop().split( "." ); if ( f.length >= 2 ){ f.splice( -1, 1, ext ); }else{ f.push( ext ); } s.push( f.join( "." ) ); return s.join( "\\" ); }