ぺーぱーふぇいす

雑記と備忘録。私はプログラマ。

Mery自作マクロ「ファイルプロパティ表示.js」

Meryマクロ。公開2本目。
需要はあんまり無いかもだけど、Meryで編集中のファイルのプロパティを表示するマクロ。

説明

Meryで編集中のファイルのプロパティを表示するマクロ。
プロパティ……というか、ファイルのフルパスとか作成日時とかをそれなりに表示するだけ。表示する方法としては、Meryのアウトプットバーに標準出力として表示する。もしくは、メッセージダイアログとして表示するかの2通り。

例: ダイアログ表示 f:id:PaperFace:20180207224920p:plain

例: アウトプットバー表示 f:id:PaperFace:20180207233219p:plain

後述するコード上部に記載されている、IS_OUTPUT_TO_OUTPUT_BARtrueを代入することでアウトプットバーへ出力。falseでメッセージダイアログに表示する。
また、表示したプロパティ情報をクリップボードに登録する機能もある。クリップボードに登録するかどうかも、コード上部のIS_SET_TO_CLIP_BOARDtrueを代入するかfalseを代入するかで制御できる。

Meryのアウトプットバーは使用しているWindowsのverとかにより、等幅フォントだったりそうでなかったり、高DPIディスプレイを使用していた場合はめっちゃ小さい表示になったりするので(今では改善されているかな?)、個人的にはメッセージダイアログに出力させて、クリップボードにもプロパティ情報を登録するようにしている。
ファイルのフルパスをどこかにコピーしたりする時は、クリップボードから一旦ペーストしてからまたカット&ペーストしたりする感じかな。

ちなみに、ファイルの属性も表示するようになっているけど、ここはあんまりテストしていないのでおまけみたいなもんだと思って欲しい。

マクロ本体

ファイルプロパティ表示.js

// ----------------------------------------------------------------------------- 
// ファイルプロパティ表示 
// about:  今開いているファイルのプロパティを表示する。 
// create: 2018/02/05 PaperFace1000 
// update: 
// Copyright (c) PaperFace1000. All Rights Reserved. 
//  http://paperface.hatenablog.com/ 
// ----------------------------------------------------------------------------- 

// 起動オプション 
//var IS_OUTPUT_TO_OUTPUT_BAR = true; //アウトプットバーに表示する 
var IS_OUTPUT_TO_OUTPUT_BAR = false; //メッセージダイアログに表示する 

var IS_SET_TO_CLIP_BOARD = true; //クリップボードにプロパティ情報を埋め込む 
//var IS_SET_TO_CLIP_BOARD = false; //クリップポードにプロパティ情報を埋め込む 




var fso = new ActiveXObject('Scripting.FileSystemObject'); 

var fullPath = Document.FullName; 
if(fullPath == "") Quit(); 

var file = fso.GetFile(fullPath); 

// 日付フォーマット 
function formatDate(date) 
{ 
    var format = "yyyy/MM/dd HH:mm:ss"; 
    var obj = new Date(date); 
    format = format.replace(/yyyy/g, obj.getFullYear()); 
    format = format.replace(/MM/g, ('0' + (obj.getMonth() + 1)).slice(-2)); 
    format = format.replace(/dd/g, ('0' + obj.getDate()).slice(-2)); 
    format = format.replace(/HH/g, ('0' + obj.getHours()).slice(-2)); 
    format = format.replace(/mm/g, ('0' + obj.getMinutes()).slice(-2)); 
    format = format.replace(/ss/g, ('0' + obj.getSeconds()).slice(-2)); 
    return format; 
} 

// ファイル属性名取得 
// 全部テストしてないから全部検知できているかわからん... 
function getAttributesName(file) 
{ 
    var result = ""; 
    var attributes = file.Attributes; 
    
    if(attributes == 0) result += "Normal, ";               //標準ファイル 
    if(attributes & 1) result += "ReadOnly, ";              //読み取り専用 
    if(attributes & 2) result += "Hidden, ";                //隠しファイル 
    if(attributes & 4) result += "System, ";                //システムファイル 
    if(attributes & 8) result += "VolumeLabel, ";           //ディスクボリュームラベル 
    if(attributes & 16) result += "Directory(Folder), ";    //ディレクトリ(フォルダ) 
    if(attributes & 32) result += "Archive, ";              //アーカイブ 
    if(attributes & 64) result += "Alias(Shortcut), ";      //エイリアス(ショートカット) 
    if(attributes & 128) result += "Compressed, ";          //圧縮ファイル 
    
    if(result.length > 2){ 
        result = result.substring(0, result.length - 2); 
    }else{ 
        result = "Unknown"; 
    } 
    
    return result; 
} 

// スペース区切りのプロパティ情報作成 
function createMsgSpaceBlank(file) 
{ 
    var msg = 
        "ファイル名:       " + file.Name + "\n" + 
        "フォルダ:         " + file.ParentFolder + "\n" + 
        "フルパス:         " + file.Path + "\n" + 
        "サイズ:           " + file.Size.toString().replace(/(\d)(?=(\d\d\d)+$)/g, "$1,") + " byte \n" + 
        "属性:             " + getAttributesName(file) + "\n" + 
        "作成日時:         " + formatDate(file.DateCreated) + "\n" + 
        "更新日時:         " + formatDate(file.DateLastModified) + "\n" + 
        "最終アクセス日時: " + formatDate(file.DateLastAccessed); 
    return msg; 
} 

// タブ区切りのプロパティ情報 
function createMsgTabBlank(file) 
{ 
    var msg = 
        "ファイル名:\t\t" + file.Name + "\n" + 
        "フォルダ:\t\t" + file.ParentFolder + "\n" + 
        "フルパス:\t\t" + file.Path + "\n" + 
        "サイズ:\t\t" + file.Size.toString().replace(/(\d)(?=(\d\d\d)+$)/g, "$1,") + " byte \n" + 
        "属性:\t\t" + getAttributesName(file) + "\n" + 
        "作成日時:\t\t" + formatDate(file.DateCreated) + "\n" + 
        "更新日時:\t\t" + formatDate(file.DateLastModified) + "\n" + 
        "最終アクセス日時:\t" + formatDate(file.DateLastAccessed); 
    return msg; 
} 

if(IS_OUTPUT_TO_OUTPUT_BAR){ 
    // Meryのアウトプットバーへ出力する場合 
    var result = createMsgSpaceBlank(file); 
    
    OutputBar.Clear(); 
    OutputBar.Visible = true; 
    OutputBar.Writeln(result); 
}else{ 
    // メッセージダイアログとして出力する場合 
    var result = createMsgTabBlank(file); 
    
    var sh = new ActiveXObject( "WScript.Shell" ); 
    var icon = 64;  //(i)アイコン 
    var button = 0; // [OK]ボタン 
    sh.Popup(result, 0, file.Name + " のプロパティ", icon + button); 
} 

if(IS_SET_TO_CLIP_BOARD) 
{ 
    ClipboardData.SetData(createMsgSpaceBlank(file)); 
} 

このマクロを作った経緯としては、よく使ってるサクラエディタAlt +Enterで同様にファイルのプロパティを小ウインドウで表示する機能があったのが便利で再現したかったからなんだよね。
まあ、必要な機能分は実装できてるかな?

最初に書かなかったけど、ダイアログで表示した場合、最終アクセス日時の表示が見切れることがある.... 。 そこらへんは個人的に「クリップボードに全部おさまってるからそれを2次利用すればいいやー」的な考えなんだけど、あまり気持ちよくないのでもしかしたら改良するかも。