miau's blog?

コマンドの実行結果をテキストエディタで開く

たまに「コマンドの出力をテキストエディタで閲覧 or 編集したい」というケースがあると思います。サクラエディタが

dir | sakura.exe

みたいに使えたら理想的ではあるんですが、これはできないようなので似たようなことをやるためのスクリプトを作ってみました。半端な出来なので、「こうすればいいんじゃね?」とか「このエディタなら .exe だけでできるよ」とかあれば教えていただけると。




■完成品

skr.cmd

標準入力の結果をテンポラリファイルに吐き出して、それをサクラエディタで開いているだけです。今のところ、テンポラリファイルの後始末は行いません。

■準備

(1) 上記の skr.cmd を PATH が通ったディレクトリ(%WINDIR%\System32 とか)に放り込む
(2) 環境にあわせて 6 行目の記述↓を書き換えておく

var sakura_path = 'C:\\sakura\\sakura.exe'


■使い方

dir | skr

みたいにして呼び出すと、dir コマンドの出力がサクラエディタで開かれるはずです。

コマンドの出力以外を開きたい場合は、Win+R で「skr」として呼び出し→Ctrl+Z で終了すればいける・・・と思ったんですが、なんだか 1 文字以上入力しないとダメそうな気がします。

■注意点

上にさらっと書いてますが、テンポラリファイルの後始末を行わないので %TEMP% にどんどんファイルが溜まっていきます。

なぜこんな造りにしているかというと、「他のコマンドからの出力 or アプリケーションからコピーしたテキストに対して Grep したい」というケースがたまにありまして。サクラエディタの Grep は「現在編集中のファイルから検索」することはできても「現在編集中のバッファから検索」というのができないので、ファイルとして残っていたほうが都合がいいんですよね。

%TEMP% にファイルが溜まることだけでなく、調子に乗って呼び出してると「最近使ったファイル」がテンポラリファイルだらけになってしまうのも問題。何かいい手があればいいんですけど。

■.cmd 化やってみました

JScript で書いてますが、普通この書き方だと、

dir | cscript skr.js

みたいに呼び出す必要があって面倒です。

そこで、ファイルの先頭に

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end

こんなおまじないを入れて、.cmd としても .js としても評価されるような形にしています。.cmd として起動されるけど、その中で自分を JScript として評価しなおしている感じ。

この手法は Windows Script Programming でよく使われている手法で・・・当たり前のように使われてて解説も見当たらないんですけど、よく知られている手法なんですかね?

それにしてもこのブログ、なんだかすごいです。バッチや WScript でここまでやるのかという感じで。こういうパズルっぽい面白さは最近の LL で味わうことは少ないなー、なんて思ったり。
posted at 20:52:36 on 2009-04-27 by miau - Category: General No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

FILE wrote:

 お世話になっております。

 久々にブログが閲覧できました。最近、サーバーの調子が悪かったようですね。

 ■1.> 「こうすればいいんじゃね?」とか「このエディタなら .exe だけでできるよ」とかあれば教えていただけると。

  「サクラエディタなら sakura.exe だけでできるよ」とか
  「サクラエディタの[ツール→外部コマンド実行]を使えばいいんじゃね?」とかでよろしいでしょうか。(駄目?)

 ■2.> skr.cmd

  var sakura_pathの行末にセミコロンがありません。(動作上は問題無し)
  #以前にも同じような指摘を…(遠い目)。

 ■3.> コマンドの出力意外を開きたい場合

  →コマンドの出力以外を開きたい場合

 ■4.> 現在編集中のバッファから検索

  ・当方マクロでやってます。
  ・grep相当を用意して(簡単なもので良ければfindでも可)、"外部コマンド実行"でも良いでしょうし。
   (標準入力に送るをON, 標準出力を得るをON, リダイレクト先を編集中のウィンドウ)
  ・保存してから外部コマンド実行(下記)でも良いでしょうけれど。
   sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F156
  ・(試していませんが)EmEditorも対応しているかもしれません。(リンク先はalpha 版)
   jp.emeditor.com/modules/newbb/viewtopic.php?topic_id=955&forum=12&post_id=4064

 ■5.> dir | cscript skr.js みたいに呼び出す必要があって面倒です。

  ・cscript //h:cscriptでcscript不要
  ・PATHEXTで拡張子不要 ↓参考 (.JS等は既存かもしれません)
   d.hatena.ne.jp/nak2k/20061020/p1

 ■6.動作確認用.js (メモ)

  WScript.Echo(WScript.StdIn.ReadAll());

 ご参考になれば、幸いです。

 #先ほど「WSH マクロの Ruby、PHP、Phython 対応」(Patches:1929358)に、syatさんの検証が追加されているのに気付きました。
  sourceforge.net/tracker/?func=detail&aid=1929358&group_id=12488&atid=312488
 #以上4/29に投稿予定のものでした。既にお気づき(返信済み)の様で。
2009-05-10 04:53:18

miau wrote:

毎度丁寧なコメントありがとうございます。いろいろと勉強になります。

>「サクラエディタの[ツール→外部コマンド実行]を使えばいいんじゃね?」とかでよろしいでしょうか。(駄目?)

用途を書いてませんでしたけど、more/less のようにコンソールでがしがし作業しているときに使いたいので、環境変数の設定やらを考えるとそれはちょっと面倒ですねぇ。

>・grep相当を用意して(簡単なもので良ければfindでも可)、"外部コマンド実行"でも良いでしょうし。
> (標準入力に送るをON, 標準出力を得るをON, リダイレクト先を編集中のウィンドウ)

「標準入力に送るをON」のオプションに気づいてませんでした・・・。これを使えば標準に近い機能でいけそうですね。

改めて自分が使う場面を分析してみると、「現在編集中のバッファから検索」したい場面というのは純粋にテキスト加工がやりたいだけ(タグジャンプは必要なし&ファイル名や行数も含まれないほうが都合がいい)ので、サクラエディタの Grep は使わずにマクロでやるのがベストな気がしてきました。

>・cscript //h:cscriptでcscript不要
>・PATHEXTで拡張子不要 ↓参考 (.JS等は既存かもしれません)

そういえばそういう機能もありましたね・・・ぜんぜん使いこなせてないです。

手元の環境がすでに //H:CScript と PATHEXT を設定済だったので試してみたのですが、この方法だとロゴが出力されてちょっと格好悪いので、結果的には cscript 経由での呼び出しでよかったです。(//Nologo オプションをつける .exe を介してやればいいんですが・・・そうするよりは 1 ファイルで完結していたほうが。)

あと、誤記についても修正しました。セミコロンもこんな感じで。http://miau.s9.xrea.com/hg/...
セミコロンについては以前も同じ指摘を・・・忘れているわけではないんですけども、どんどん後回しになっちゃってますね。せっかく指摘いただいているのに申し訳ないです。
2009-05-12 22:50:11

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。