「よく使うフォルダ」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
手石 (トーク | 投稿記録)
編集の要約なし
編集の要約なし
1行目: 1行目:
quickaccess.js
quickaccess_readme.txt<br>
// 2012/11/21<br>
// 2012/12/19<br>
<br>
1.動作<br>
・ポップアップメニューにあらかじめ登録したフォルダの一覧を表示し、エクスプローラーで開く。<br>
<br>
2.使い方<br>
・マクロを実行するとこのマクロのあるフォルダに登録用ファイル(quickaccess.txt)が作成されます。<br>
・登録用ファイルに、フォルダパスとポップアップメニューに表示する内容とを”>>”で区切って、1件1行で書いてください。<br>
・フォルダパスは絶対パスで、”\”で終わっている必要があります。<br>
・ポップアップメニューに表示する内容がないときは、フォルダパスを表示します。<br>
・複数の”>>”があるときは、最後の部分のみが表示されます。つまり、例1と例2は同じ表示になります。<br>
(例1)C:\Program Files (x86)\Mery\>>Meryのフォルダ<br>
(例2)C:\Program Files (x86)\Mery\>>ほげ>>ほげ>>Meryのフォルダ<br>
<br>
3.その他<br>
・Mery 2.0.11.3997、Windows7 x64 Home sp1 で作成しました。<br>
<br>
[更新履歴]<br>
2012/12/19<br>
・すでにフォルダが開かれているときは、新しく開かずにアクティブになるようにしました。<br>
 → tasklist の結果を保存するため、quickaccess.logというファイルを作成します。 <br>
 → ウィンドウタイトルが得られないケースがあるので不完全ですが……。<br>
・関数の入れ替え・追加・変更。<br>
<br>
<br>
<pre>
<pre>
1.動作
・ポップアップメニューにあらかじめ登録したフォルダの一覧を表示し、エクスプローラーで開く。
2.使い方
・マクロを実行すると“My Macros”フォルダに“quickaccess.txt”が作成されます。
 この場所とファイル名は、“file_path”と“file_name”で指定しています。
・“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 で作成しました。
</pre>
<pre>
// quickaccess.js
// quickaccess.js
// 20121121
// 2012/11/21
// 2012/12/19


var file_Name = "quickaccess.txt"
var file_FullName = changeExt( ScriptFullName, "txt" );
var file_FullName = getPath(Editor.FullName) + "My Macros\\" + file_Name;
var file_Name = file_FullName.split( "\\" ).pop();
var WshShell = new ActiveXObject("WScript.Shell");
var WshShell = new ActiveXObject( "WScript.Shell" );
var objFso = new ActiveXObject("Scripting.FileSystemObject");
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );


// ファイルを読み取り専用で開く。
// ファイルを開く。
// 第2引数:オープンモード。
// 第2引数:オープンモード。
var FORREADING      = 1;    // 読み取り専用
// 第3引数:ファイルが存在しなかったとき。
var FORWRITING      = 2;    // 書き込み専用
var FORAPPENDING    = 8;    // 追加書き込み
// 第3引数:ファイルが存在しなかった場合に“true”なら作成する。省略した場合は、“false”(作成しない)。
// 第4引数:開くファイルの形式。
// 第4引数:開くファイルの形式。
var TRISTATE_TRUE      = -1;   // Unicode
//  TRISTATE_TRUE:Unicode
var TRISTATE_FALSE      = 0;  // ASCII
//  TRISTATE_FALSE:ASCII
var TRISTATE_USEDEFAULT = -2;   // システムデフォルト
//  TRISTATE_USEDEFAULT:システムデフォルト
var objFile = objFso.OpenTextFile(file_FullName, FORREADING, true, TRISTATE_FALSE );
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 );


// 一行ずつ読み込んで配列に。
// 一行ずつ読み込んで配列に。
// 空のファイルに“objFile.Readall()”はエラー。
var folderAry = [];
var folderAry = [];
while (!objFile.AtEndOfStream){
while ( !objFile.AtEndOfStream ){ folderAry.push( objFile.ReadLine() ) }
    folderAry.push(objFile.ReadLine());
}


// 読み終わったファイルを閉じる。
// 読み終わったファイルを閉じる。
48行目: 57行目:


var offset = 10; // 固定メニュー数の上限。
var offset = 10; // 固定メニュー数の上限。
var reg = new RegExp("^[a-zA-Z]:\\\\(.*\\\\)*$"); // フォルダを表す正規表現のつもり。
var reg = new RegExp( "^[a-zA-Z]:\\\\(.+\\\\)*$" ); // フォルダを表す正規表現のつもり。
var menu = CreatePopupMenu();
var menu = CreatePopupMenu();
var submenu = CreatePopupMenu();
var submenu = CreatePopupMenu();
for (var i in folderAry){
for ( var i in folderAry ){  
// “>>”でフォルダパスと表示名に分離。
// “>>”でフォルダパスと表示名に分離。
var item = folderAry[i].split(">>");
var item = folderAry[ i ].split( ">>" );
item_0 = item[0];
item_0 = item[ 0 ];
item_1 = ((item.length <= 1)||item[item.length-1] == "" )? item[0]: item[item.length-1];
item_1 = item.slice ( -1 );
if (reg.test(item_0)){
if ( reg.test( item_0 ) ){  
menu.Add(item_1, +i + offset, 0);
menu.Add( item_1, +i + offset, 0 );
}
}
}
}
menu.Add("-------", 0, meMenuSeparator)
menu.Add( "-------", 0, meMenuSeparator )
menu.Add("このドキュメントのフォルダ", 1, 0)
menu.Add( "このドキュメントのフォルダ", 1, 0 )
menu.Add("ユーザーフォルダ", 2, 0)
menu.Add( "ユーザーフォルダ", 2, 0 )
menu.Add("-------", 0, meMenuSeparator)
menu.Add( "-------", 0, meMenuSeparator )
menu.AddPopup("設定", submenu);
menu.AddPopup( "設定", submenu );
submenu.Add("フォルダの追加", 3, 0);
submenu.Add( "フォルダの追加", 3, 0 );
submenu.Add(file_Name + "を開く", 4, 0);
submenu.Add( file_Name + "を開く", 4, 0 );
var r = menu.Track(mePosMouse);
var r = menu.Track( mePosMouse );


switch(r){
switch( r ){  
case 0: break;
case 0: break;
case 1:
case 1:
WshShell.Run('explorer "' + Document.path + '"');
WshShell.Run( 'explorer "' + Document.path + '"' );
break;
break;
case 2:
case 2:
var folder_user = WshShell.SpecialFolders("Desktop").replace("Desktop","")
var folder_user = WshShell.SpecialFolders( "Desktop" ).replace( "Desktop","" )
WshShell.Run('explorer "' + folder_user + '"');
WshShell.Run( 'explorer "' + folder_user + '"' );
break;
break;
case 3:
case 3:
path = (document.path == "")? getPath(Editor.FullName): document.path;
path = ( document.path == "" )? getPath( Editor.FullName ): document.path;
var input = prompt("フォルダパス(>>表示名)を入力してください。", path + ">>" )
var input = prompt( "フォルダパス(>>表示名)を入力してください。", path + ">>" )
if (input != ""){
if ( input != "" ){  
var objFile = objFso.OpenTextFile(file_FullName, FORAPPENDING, true, TRISTATE_FALSE );
var objFile = objFso.OpenTextFile( file_FullName, FORAPPENDING, true, TRISTATE_FALSE );
objFile.WriteLine(input);
objFile.WriteLine( input );
objFile.close();
objFile.close();
}
}
break;
break;
case 4:
case 4:
if (!isOpened(file_Name)){
if ( !isOpened( file_FullName ) ){  
Editor.NewFile();
Editor.NewFile();
Editor.Documents.Item(editor.Documents.Count-1).Activate();
Editor.Documents.Item( editor.Documents.Count-1 ).Activate();
}
}
Editor.OpenFile(file_FullName);
Editor.OpenFile( file_FullName );
break;
break;
default :
default :
if (r >= offset){WshShell.Run('explorer "' + folderAry[r-offset].split(">")[0] + '"');}
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 )
};
}
}
}


// “filename”をエディタで開いていれば“true”。
objFile = null;
function isOpened(filename){
objFso = null;
WshShell = null;
 
// “filefullname”をエディタで開いていれば“true”。
function isOpened( filefullname ){  
var result = false;
var result = false;
for (var i = Editor.Documents.Count-1; i>=0; i--){
for ( var i = Editor.Documents.Count-1; i>=0; i-- ){  
result = (result || Editor.Documents.Item(i).Name == filename);
result = ( result || Editor.Documents.Item( i ).FullName.toUpperCase() == filefullname.toUpperCase() );
}
}
return result;
return result;
108行目: 129行目:


// ファイルのパス部分を返す。
// ファイルのパス部分を返す。
function getPath(file_FullPath, slashend){
function getPath( file_FullPath ){  
// 念のためにファイルパス+ファイル名の形式になっているかを正規表現で確認する?
var ary = file_FullPath.split( "\\" );
// var reg = new RegExp("^[a-zA-Z]:\\\\(.*\\\\)*[^\\\\]+$");
ary.pop();
// if (!reg.test(file_FullPath)){return "pattern error!"}
return ary.join( "\\" ) + "\\";
if (arguments.length < 2){slashend = true}
}
var ary = file_FullPath.split("\\");
 
// 最後の“\”以降の要素を除去する。
function isFolderOpened( str ){
ary.splice(ary.length-1, 1);
var stdout_log = changeExt( ScriptFullName, "log" );
return (slashend)? ary.join("\\")+"\\": ary.join("\\");
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( "\\" );
}
}


objFile = null;
objFso = null;
WshShell = null;
</pre>
</pre>

2012年12月21日 (金) 16:27時点における版

quickaccess_readme.txt
// 2012/11/21
// 2012/12/19

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というファイルを作成します。
 → ウィンドウタイトルが得られないケースがあるので不完全ですが……。
・関数の入れ替え・追加・変更。



// 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, FORAPPENDING, true, 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( "\\" );
}

スポンサーリンク