【JScript】ディレクトリ内の全てのファイルを開き特定文字を置換する

保守開発において改修前後で比較することが多いですが、
ファイル内に自動で更新日時が入るようなファイルが大量にある場合、
更新日時をある一定の文字に置換し、改修前後で比較可能にします。

対象の大量ファイルは「C:/replaceBefore」にあるとし、
置換後の大量ファイルを作成するために「C:/replaceAfter」を作成しておきます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var files = fso.GetFolder("C:/replaceBefore").Files;
var e = new Enumerator(files);
// ディレクトリ内の全てのファイル分繰り返す。
for ( ; !e.atEnd(); e.moveNext()) {
    var file = e.item();
    var fileFullPathBefore = "C:/replaceBefore/" + file.Name;
    var fileFullPathAfter  = "C:/replaceAfter/" + file.Name;
    WScript.Echo(fileFullPathBefore + "を処理します。");

    // 入力ファイルの設定
    // Typeの設定値
    // 1:バイナリを表す。
    // 2:既定値。charsetで指定した文字セットで文字列を表す。
    var sr = new ActiveXObject("ADODB.Stream");
    sr.Type = 2;
    sr.charset = "utf-8";
    sr.Open();
    sr.LoadFromFile(fileFullPathBefore);

    // 入力ファイルの読込み
    // ReadTextの第1引数
    // -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
    // -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
    var temp = sr.ReadText(-1);
//  WScript.Echo(temp);
    sr.Close();
    sr = null;

    // 出力ファイルの設定
    var sw = new ActiveXObject("ADODB.Stream");
    sw.Type = 2;
    sw.charset = "utf-8";
    sw.Open();

    // 置換文字列検索用
    // RegExpの第2引数に'g'を指定すると全置換になる。
    var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}");
//  var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}", 'g');

    // 出力ファイルの書込み
    // WriteTextの第2引数
    // ActiveXObjectのTypeが文字列(2)の場合に利用する。
    // 0:既定値。文字列を書き込む。
    // 1:文字列+改行を書き込む
    sw.WriteText(temp.replace(reg, ""), 0);

    // 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
    // 書き込んだオブジェクトのポジションをゼロに戻し、
    // バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
    // この処理順序は変更不可。
    if (sw.charset == "utf-8") {
        sw.Position = 0;
        sw.Type = 1;
        sw.Position = 3;
        var textBinary = sw.Read();
        sw.Close();
        sw.Type = 1;
        sw.Open();
        sw.Write(textBinary);
    }

    // 出力ファイルの保存
    // SaveToFileの第2引数
    // 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
    // 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
    sw.SaveToFile(fileFullPathAfter, 2);
    sw.Close();
    sw = null;
}
fso = null;

【JScript】スクリプトの実行

Windows上でJScriptを実行するには
コマンドプロントから実行するのが便利です。

CScript ファイル名

CScript.exeは「C:/Windows/System32」と「C:/Windows/SysWOW64」に存在しています。
環境変数の設定によりどちらかが優位性が高い設定になっています。

【サクラエディタ】マクロのショートカット登録

サクラエディタのマクロをショートカットに登録します。

  • マクロの登録
    マクロを作成後、ツールバーの「設定」-「共通設定」を選択し、「マクロ」タブを開きます。
    「マクロ一覧」にマクロの保存先ディレクトリを指定します。
    任意の番号を選択し、行をアクティブにします。
    「名前」に任意の分かりやすい名前を設定します。
    「File」に保存したマクロを選択します。
    「設定」ボタンを押下します。
    ここの「設定」ボタンを押下しないと反映されないので注意です。
  • ショートカットに登録
    「キー割り当て」タブを開きます。
    「種別」に「外部マクロ」を選択します。
    登録したマクロを選択し、キーの割り当てを選択し、「割付」ボタンを押下します。
    これでサクラエディタ上で割り当てたキーを押下すると登録したマクロが動作します。

【サクラエディタ】日付の置換マクロ(JScript版)

サクラエディタの日付を決まった値に置換。(JScript版)
置換後の日付はDB2のTimeStamp型に登録可能。
キーマクロの記録はできませんが、
JScript版なので演算や変数も利用可。

// 変数宣言
var FileName;
// すべて置換
// [0-9]{n}:0~9の数字をn回繰り返すの意味
Editor.ReplaceAll('[0-9]{4}-[0-9]{2}-[0-9]{2}-00[.]00[.]00[.]000000','2015-12-31-00.00.00.000000', 60)
// 再描画
Editor.ReDraw(0)
// すべて選択
Editor.SelectAll(0)
// 選択行の昇順ソート
Editor.SortAsc(0)
// ファイル名をフルパスで取得
FileName = GetFilename();
// ファイル名を変更
FileName = FileName.replace(".txt", "_比較用.txt");
// ファイルを保存
// 第1引数:ファイル名フルパス
// 第2引数:0はSJIS保存
// 第3引数:0は改行コードは変更しない
Editor.FileSaveAs(FileName, 0, 0);

JScriptはJavaScriptとは異なります。
JScript:Microsoftが開発したJavaScript互換のスクリプト言語
JavaScript:NetscapeとSunが共同開発したスクリプト言語

昔は利権の絡みとか色々あったんでしょうが、
今は標準仕様に準拠しているようで、書き方は同一といってもいいようです。

とはいえ、JSCriptを正式にサポートしているのはMicrosoftのみであり、
Web上でFireFoxやChromeで動作させるといった場合を考えると、
通常はJavaScriptで定義した方が良いようです。

サクラエディタのマクロはJScriptになります。

【サクラエディタ】日付の置換マクロ(キーマクロ版)

サクラエディタのキーマクロで日付を決まった値に置換。
置換後の日付はDB2のTimeStamp型に登録可能。
ツールバーの「ツール」-「キーマクロの記録開始」で記録できます。
キーマクロ版なので演算や変数は利用不可。

// すべて置換
// [0-9]{n}:0~9の数字をn回繰り返すの意味
S_ReplaceAll('[0-9]{4}-[0-9]{2}-[0-9]{2}-00[.]00[.]00[.]000000','2015-12-31-00.00.00.000000', 60)
// 再描画
S_ReDraw(0)
// すべて選択
S_SelectAll(0)
// 選択行の昇順ソート
S_SortAsc(0)

【Excel】フォルダ内のエクセルファイルに対して検索を行う

Dir関数を用いるため、ネットワーク上の長いファイルパスには未対応です。

Sub Test() 
    ' 検索速度向上のポイント
    ' 何度も登場するブックやセルは変数に格納し、メモリを参照する。
    ' 画面チラつきを防止する。

    ' 画面チラつきを防止する。
    Application.ScreenUpdating = False

    ' フォルダパスとファイル名を宣言する。
    Dim strFilePath As String
    Dim strFileNmae As String
         
    ' テキストボックスかセル入力でフォルダを指定させる。
    strFilePath = "C:\Users\test\Desktop\テストディレクトリ"
    
    ' 末尾が\ではない場合、\を追加する。(未実装)
    strFilePath = strFilePath & "\"
    
    ' 指定フォルダ内のファイル名を取得する。
    strFileName = Dir(strFilePath, vbNormal)

    ' 結果シートを変数に設定する。
    Dim resultBookSheet As Worksheet
    Set resultBookSheet = Worksheets("sheet1")
   
    ' 結果シートの行数を宣言する。
    Dim longGyo As Long
    longGyo = 1

    ' 指定フォルダ内のファイルがなくなるまで繰り返す。
    Do While strFileName <> ""

        Dim result As Range
        Dim firstAddress As String

        ' ファイルを開く。
        With Workbooks.Open(Filename:=strFilePath & strFileName)

            ' ファイル内のシート数を取得する。
            Dim sheetCnt As Long
            sheetCnt = .Worksheets.Count
           
            ' 1シート目からnシート目まで繰り返す。
            Dim i As Long
            For i = 1 To sheetCnt
                ' What:=検索するデータを指定
                ' After:=検索を開始するセルを指定
                ' LookIn:=値を検索
                ' LookAt:=一部が一致するセルを検索
                ' SearchOrder:=列単位で検索(行単位のxlByColumnsを指定しているとセル結合が検索されない)
                ' SearchDirection:=順方向に検索
                ' MatchCase:=大文字と小文字を区別しない
                ' MatchByte:=半角と全角を区別しない
                ' SearchFormat:=セル書式は検索条件に指定しない
                Set result = .Worksheets(i).Cells.Find(What:="APS" _
                    , After:=ActiveCell _
                    , LookIn:=xlValues _
                    , LookAt:=xlPart _
                    , SearchOrder:=xlByRows _
                    , SearchDirection:=xlNext _
                    , MatchCase:=False _
                    , MatchByte:=False _
                    , SearchFormat:=False)
               
                If Not result Is Nothing Then
                    firstAddress = result.Address
                    Do
                        resultBookSheet.Cells(longGyo, 1).Value = strFilePath & strFileName
                        resultBookSheet.Cells(longGyo, 2).Value = .Worksheets(i).Name
                        ' resultBookSheet.Cells(longGyo, 3).Value = "セル(" & result.Row & ", " & result.Column & ")"
                        resultBookSheet.Cells(longGyo, 3).Value = "セル(" & result.Address & ")"
                        resultBookSheet.Cells(longGyo, 4).Value = .Worksheets(i).Cells(result.Row, result.Column).Value
                        longGyo = longGyo + 1
                        Set result = .Worksheets(i).Cells.FindNext(result)
                        If result Is Nothing Then
                            Exit Do
                        End If
                        If result.Address = firstAddress Then
                            Exit Do
                        End If
                    Loop
                End If
            Next i
            
            ' 保存せずファイルを閉じる。
            .Close SaveChanges:=False
        End With

        ' 次のファイルを取得する。
        strFileName = Dir()
    Loop
        
    ' 画面チラつき防止を解除する。
    Application.ScreenUpdating = True
    
End Sub

【WordPress】プラグイン追加その2

  • カテゴリ一覧のソート
    カテゴリが増えてきたので整理をかねて
    カテゴリ一覧のソートをしたくなりました。
    標準では実装されていないため、
    「Category Order and Taxonomy Terms Order」というプラグインを導入しました。

    設定値はデフォルトのままで
    D&Dでカテゴリの順序を変更できます。

  • Markdown記法の導入
    WordPressの段落はタグの記述が面倒なため、
    「Markdown」というプラグインを導入しましたが、
    現在はまだ未使用です。
  • カウンタの導入
    「Count Per Day」というプラグインを導入しました。
    公式からは消えているので下記サイトから最新版のZIPファイルをダウンロードし、
    ZIPファイルのままアップロードしてインストール。
    設定値はデフォルトのままで
    総閲覧数と総訪問者数を表示してみました。
    http://www.tomsdimension.de/wp-plugins/count-per-day

【WordPress】プラグイン追加その1

  • テーブル表示
    TablePressを導入。
    TablePressのプラグインのオプションでテーマにあうようにカスタムCSSを設定。

    .tablepress thead th {
    	font-size: 10pt !important;
    	color: #989eae !important;
    	text-align: center !important;
    	background-color: #202228 !important;
    	padding: 5px !important;
    	border-width: 1px !important;
    	border-style: solid !important;
    	border-color: #444855 !important;
    }
    
    .tablepress tbody td {
    	font-size: 10pt !important;
    	color: #989eae !important;
    	text-align: left !important;
    	background-color: #202228 !important;
    	padding: 5px !important;
    	border-width: 1px !important;
    	border-style: solid !important;
    	border-color: #444855 !important;
    }
    
  • ソースコードハイライト
    SyntaxHighlighter Evolvedを導入。
    SyntaxHighlighterのバージョンは2.xを選択。
    テーマはEmacsを選択。

【WordPress】WordPress設定

  • 外観-テーマ
    Paramentを入れました。
  • 外観-ウィジェット
    最近のコメントと最近の投稿を使用停止。
  • 外観-テーマ編集
    style.cssの編集で最終行に下記内容を追加

    .form-allowed-tags {
    	display:none !important;
    }
    
  • ユーザー-あなたのプロフィール
    「ビジュアルリッチエディターを使用しない」にチェック。
  • 設定-一般設定
    新規ユーザーのデフォルト権限グループを「投稿者」に設定。
    日付のフォーマットを「YYYY/MM/DD」に設定。
    時刻フォーマットを「HH24:MI」に設定。
  • 設定-表示設定
    1ページに表示する最大投稿数を「5」に設定。
    RSS/Atom フィードで表示する最新の投稿数を「5」に設定。
  • 設定-ディスカッション
    投稿のデフォルト設定のチェックを全て外す。
    自分宛のメール通知のチェックを全て外す。
  • 設定-パーマリンク設定
    日付と投稿名を選択。
    カスタム構造で「/%year%/%monthnum%/%day%/」を設定したところ、
    この内容では1日に複数回の記事を投稿した場合、
    記事が一意に特定できないため、プレビュー機能が利用できなくなるので注意。