コマンドプロンプトみたいな事をする
以前から TextRunRun を使ってコマンドプロンプトみたいな事を出来ないかと思っていました。
それで調べてみたところ AutoHotkey のWebサイトの 「Documentation」 の中にそれに関係する事が載っていました。
AutoHotkey のWebサイトは、このホームページとは全く関係のない別のWebサイトです。
AutoHotkey を公開しているWebサイトそのものです。
今回のこのページで説明する事は、このWebサイトの中にある以下のページを参考にした事について語っています。
この AutoHotkey のWebサイトの中の Documentation のページに移動して、 左のサイドバーにある、 Process 、 Run[Wait] のページの中に参考になるものが載っていました。
ですので、このページで説明する事は、以下のページを参考にした事について語っています。
上記の
Run[Wait]
のページの中の下にある、
Examples
にある、
#4
と
#7
にある例を参考にして、
「TRR
でコマンドプロンプトで実行するのと同じ様な事をする例」を作りました。
他にも上記のページの中に今回の目的に合った例は他にもありますが、とりあえずこの二つの例を参考にしています。
#7を参考にしてみた例
まず、 #7 にある例を参考にして作ってみたものを挙げます。
この例なのですが、
これは、オブジェクト
それもCOMオブジェクト
を使っているものなので、
TextRunRun
のスクリプトから実現はできません。
よって、 AutoHotkey のスクリプトの方に追加して作る事にします。
つまり、ソースコード版の TextRunRun からしか実現できません。
ソースコード版の TextRunRun に、以下の関数を作ります。
getStdOut( command ){
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(ComSpec . " /C " . command)
return exec.StdOut.ReadAll()
}
この関数を
userMakeSubroutineAndFunction.ahk
の中にでも加えます。
関数さえ作ってしまえば、後は簡単です。
上記の関数以外は TextRunRun のスクリプトを用意するだけで実現できます。
以下の 2つのアイテムを作ります。
global runout_command =
global runout_stdout =
runout_command = %B_itemArgAll%
if( runout_command == "" ){
return
}
runout_stdout := getStdOut(runout_command)
F_output(runout_stdout)
%--
この 2つのファイルを item の中に入れ アイテム として登録します。
そして、グローバル変数の宣言をしているファイルの方は、 起動時に実行させるアイテム として用意しているものなので、 startup の中に 1_runStdOut のフォルダを作り、起動時に実行されるようにします。
そしてさらに、作った アイテム をキーから実行させるため、 hotkeyOnText の中に以下のファイルを追加します。
runStdOut
以上で全てです。
テキスト上から、 Alt+S のキーで実行できるようにしています。
テキストにコマンドを入力して Alt+S を押すと、コマンドプロンプトと同じ事が実行できるようになっていました。
使えるかどうかを試すなら、 dir /b といったものを試してみてください。
#4を参考にしてみた例
次は #4 の例を使って実現します。
今回の例は、前回の様にオブジェクトを使わない事もあって、 AutoHotkey のスクリプトを使いません。
つまり、コンパイル済みの TextRunRun と、 TextRunRun のスクリプトのみで作成可能です。
まず、起動時に実行させる必要がある
アイテム
を挙げます。
先程のと、名前が被らない変数を宣言しています。
global outfile_command =
global outfile_stdout =
global outfile_output = %A_ScriptDir%\output.txt
続いて、以下が #4 の例を参考にして作った アイテム です。
outfile_command = %B_itemArgAll%
if( outfile_command == "" ){
return
}
RunWait, %ComSpec% /c %outfile_command% > "%outfile_output%" 2>&1, , Min
Sleep, 1000
FileRead, outfile_stdout, %outfile_output%
F_output(outfile_stdout)
; FileAppend , %outfile_stdout%, *
%--
以上の
2つのファイルを
item
の中に加え、
startup
の中に
1_outfile_runStdOut
のフォルダを作り、それが起動時に実行されるようにします。
今回のは、一度ファイルに出力させてそれからその内容を読み込む形にしています。
%A_ScriptDir%\output.txt のファイルを使っています。
outfile_runStdOut が実行されると、 TRR の実行ファイルがあるフォルダ内に output.txt が作られ、一度そのファイルに出力されるようにしています。
今回のも、キーから実行できる様にするため
hotkeyOnText
の中に以下のファイルを追加します。
outfile_runStdOut
以上で完了です。
Alt+W
で実行できるようにしています。
テキストにコマンドを入力して、 Alt+W を押せば、コマンドプロンプトと同じ様な感じの処理ができる事を確認できると思います。
特に今回の例は TextRunRun のスクリプトのみで完結できるので、すぐに作れる良さがあります。
正直こんなに簡単に出来るとは思っていなかったため、すごく感動しました。
今回の例はエラーも表示できる
実は #7 の例を元に作ったものは、エラーに関するものは表示してくれませんでした。
ですが、今回作ったものはエラーの内容も表示するように出来ています。
RunWait の部分に 2>&1 を加える事で、エラーも出力する事を可能にしています。
#7 のを例に作った先程の例よりも、 今回作った例の方が便利に使えるものといえるでしょう。
そもそも、エラーの方の表示の方が重要ですし。
「コマンドプロンプトと同じ様な事ができるもの」はとりあえず出来ました。
出来たのはいいのですが、あくまで似たようなものが出来るという感じで捉えた方がよいと思います。
本当にコマンドプロンプトと同じ様な事ができるかどうかは怪しいです。
あくまで遊びの範囲で使う程度にしてください。
TRR全体に対していえる事ですが。
わたくしブランボンも TRR を使ってコマンドプロンプトと同じ様な事をして使っていったりはしていません。
あまり信用はしない感じでとらえて、重要な処理とかは実行させない方がよいと思います。
使う事を警告しておいて何ですが、
今回の
Alt+S
や
Alt+W
を使った場合、
TextRunRun
のスクリプトを通して使う訳なので、
# #
や
% %
で囲まれた文字を使用する事が出来ます。
この様に、
アイテム
のリンク先を使う事や、
%A_MyDocuments%
といった
AutoHotkey
の組み込み変数も使用できます。
( もちろん、ユーザーが宣言したグローバル変数も使えます。 )
それと、相対パスでファイルを指定する場合は TextRunRun のカレントフォルダが基準になります。
TRR のカレントフォルダは &cd を使って位置を変えます。
コマンドプロンプト内に出力する
さて、既に目的どうりのものは出来ているのですがさらに余計な事も試してみます。
今までは F_output( ) の関数を使って、 蓄え式の説明表示 の中に出力させていました。
これを、コマンドプロンプトの方に出力させる様にしてみます。
TRR から実行して、コマンドプロンプトの方に出力させるという事です。
AutoHotkey
は、コマンドプロンプトから起動させて使用した場合
FileAppend , [Text], *
この処理からコマンドプロンプトで指定の文字が出力できるようです。
これを使って、結局またコマンドプロンプトの方に結果を出力させるようにしてみます。
これを試すには場合により準備が必要だったりします。
今回の処理をうまく動作させるには、
比較的新しい
Ahk2Exe
でコンパイルした
TextRunRun
が必要になります。
ソースコード版なら、比較的新しい
AutoHotkey
で動作させる事が必要です。
古い AutoHotkey の場合、全角文字がうまく出力されないようです。
準備さえ出来ていれば後は簡単です。
先程挙げた
outfile_runStdOut
の
アイテム
の処理の最後に
; FileAppend , %outfile_stdout%, *
という記述があります。
この部分はコメントアウトしている訳ですが、この部分をコメントにしないようにするだけです。
逆に、1つ上にある
F_output(outfile_stdout)
の行を削除するかコメントアウトしてください。
これで完了です。
コマンドプロンプトなどから起動して使う
さて、使う時ですが TextRunRun を起動する際、コマンドプロンプトから起動させたものを使います。
その際は、
[フォルダのパス]\TextRunRun.exe | more
といった実行のさせ方をする必要があります。
後は先程やってみた事と同じ事をするだけです。
テキスト
にコマンドを記入して、
Alt+W
を押せばコマンドが実行されて、結果はコマンドプロンプトの方に出力されると思います。
さらにオマケ。 サクラエディタ に出力
エディターの中には、このコマンドプロンプトと同じように 出力として使える機能があるエディターがあるようです。
サクラエディタ で出力ができたのでやり方を挙げておきます。
サクラエディタ
のウインドウを開いたら、
上部のツールバーの
ツール(T)
を選んで
外部コマンドの実行(X)
を選びます。
ウインドウが表示されるので、
名前(N)
の入力欄に
TextRunRun
のフルパスを入力して実行させます。
コマンドプロンプトの時のように、
| more
は記入しません。
後の項目はよくは分かりませんが、
チェックボックスは
標準出力を得る(S)
にだけチェックを入れ、
文字コードは
SJIS
を選べばよいと思います。
実行のボタンを押して TextRunRun を起動すると サクラエディタ を出力先にできたので興味がある方は試してみてください。