やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

秀丸ファイラで一発ファイル作成(shスクリプト版)

Linuxコマンドを使って日付ファイルを作成する。

成果物

GitHubHidemaruFiler.MakeNowFile
GitHubHidemaruFiler.MakeNowDirectory

ついでにディレクトリ版も作った。

対象環境

前回まで

秀丸ファイラで日付ファイルを一発作成したい。PowerShellは動作が遅かった。

Linuxコマンドではインラインができずに悩み、諦めた。

今回

shスクリプトファイルで作成した。

実行速度 実装
10~20秒 秀丸ファイラで一発ファイル作成(PowerShellインライン版)
1~2秒 今回

速くなったというか、PowerShellが特別に遅すぎるだけ。今回のでさえラグを感じる。

ソースコード

mknfile.sh

# $1 /some/path/string/
# $2 py rb mb ...

dir=`echo "$1" | tr '\\' '/'`
file=`date "+%Y%m%d%H%M%S%3N.$2"`
touch $dir$file

たったこれだけ。

CallByHidemaru.bat

:: %1 %dir% 秀丸ブックマーク機能の%V(末尾に\なし)
:: %2 %ext% 任意のファイル拡張子(py,rb,mb,...)
@echo off
set dir=%1
set ext=%2
if not "%dir:~-1%"=="/" (set dir=%dir%/)
bash mknfile.sh "%dir%" "%ext%"
@echo on

秀丸ファイラはディレクトリの末尾に\を付与しない。それが一般的かどうかは知らないが、末尾に\を付与して渡すことにした。

秀丸ファイラのブックマーク/ツール項目に、以下のコマンドを登録する。

C:\CallByHidemaru.bat %V py

あとは任意のキーに割り当てて実行すれば、20160102030405678.pyのようなファイルが生成される。

もし秀丸ファイラの%V, %dのどちらかが、/区切記号でパスを渡してくれていたら、以下のコマンドをブックマーク/ツール項目に登録するだけで済んだかもしれない。

C:\MinGW\msys\1.0\bin\bash.exe -c "fname=`date \"+%Y%m%d%H%M%S%3N.py\"`; touch \"%V/$fname\""

課題

コマンドプロンプトが一瞬だけ表示されてウザい。

おそらくWSH/JScriptで以下のように実装すると非表示で起動できると思う。

test.js

var dir = WScript.Arguments(0);
var shell = WScript.CreateObject("WScript.Shell")
shell.Run("<コマンド>", 0);
shell = null;

ポイントはWScript.Shell.Run関数の第二引数。0~10の値でウインドウの状態を指定できるらしい。0なら非表示。

以下のような秀丸ファイラのブックマーク/ツール項目を作成して実行する。

cscript.exe test.js %V

でも、これはやらない。

やらない理由

すでに「cmd→bash→dateコマンド」となっており面倒くさい。これが「WSH(JScript)→cmd→bash→dateコマンド」のようになってしまう。異なる文脈間での連携が必要になると、それだけ無駄な苦労を強いられるかもしれない。すでにパス区切記号など連携において支障をきたし、スクリプトファイル化するという無駄な苦労が生じた実績がある。

かといって、秀丸ファイラのツール項目でJScript呼出機能js:<JScriptファイルパス>を使えば、ファイル作成をJScriptで書く羽目になる。これ以上、糞言語に悩まされたくない。

よって、よほど黒窓がウザいと感じない限り、妥協することにする。

所感

日付ファイル作成なんて速攻で終わると思ったのに、調べると奥が深くて苦労した。

次回、脱線ついでにC#で日付文字列を取得するコンソールアプリを作ってみる。