コマンドプロンプトみたいな事をする

以前から TextRunRun を使ってコマンドプロンプトみたいな事を出来ないかと思っていました。

それで調べてみたところ AutoHotkey のWebサイトの 「Documentation」 の中にそれに関係する事が載っていました。

外様のWebサイト

AutoHotkey のWebサイトは、このホームページとは全く関係のない別のWebサイトです。

AutoHotkey を公開しているWebサイトそのものです。

AutoHotkey

今回のこのページで説明する事は、このWebサイトの中にある以下のページを参考にした事について語っています。

この AutoHotkey のWebサイトの中の Documentation のページに移動して、 左のサイドバーにある、 ProcessRun[Wait] のページの中に参考になるものが載っていました。

ですので、このページで説明する事は、以下のページを参考にした事について語っています。

Run / RunWait - Syntax & Usage | AutoHotkey v1

上記の 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つのアイテムを作ります。

1_runStdOut.txt
global runout_command =
global runout_stdout =
runStdOut.txt
runout_command = %B_itemArgAll%
if( runout_command == "" ){
    return
}
runout_stdout := getStdOut(runout_command)
F_output(runout_stdout)
%--

この 2つのファイルを item の中に入れ アイテム として登録します。

そして、グローバル変数の宣言をしているファイルの方は、 起動時に実行させるアイテム として用意しているものなので、 startup の中に 1_runStdOut のフォルダを作り、起動時に実行されるようにします。

そしてさらに、作った アイテム をキーから実行させるため、 hotkeyOnText の中に以下のファイルを追加します。

Alt_s.txt
runStdOut

以上で全てです。

テキスト上から、 Alt+S のキーで実行できるようにしています。

テキストにコマンドを入力して Alt+S を押すと、コマンドプロンプトと同じ事が実行できるようになっていました。

使えるかどうかを試すなら、 dir /b といったものを試してみてください。

#4を参考にしてみた例

次は #4 の例を使って実現します。

今回の例は、前回の様にオブジェクトを使わない事もあって、 AutoHotkey のスクリプトを使いません。

つまり、コンパイル済みの TextRunRun と、 TextRunRun のスクリプトのみで作成可能です。

今回の例で使っているファイルは、以下のリンクからダウンロードできます。

runOutfileStorage.zip

( 2.6 KByte )

まず、起動時に実行させる必要がある アイテム を挙げます。
先程のと、名前が被らない変数を宣言しています。

1_outfile_runStdOut.txt
global outfile_command =
global outfile_stdout =
global outfile_output = %A_ScriptDir%\output.txt

続いて、以下が #4 の例を参考にして作った アイテム です。

outfile_runStdOut.txt
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 の中に以下のファイルを追加します。

Alt_w.txt
outfile_runStdOut

以上で完了です。
Alt+W で実行できるようにしています。

テキストにコマンドを入力して、 Alt+W を押せば、コマンドプロンプトと同じ様な感じの処理ができる事を確認できると思います。

特に今回の例は TextRunRun のスクリプトのみで完結できるので、すぐに作れる良さがあります。

正直こんなに簡単に出来るとは思っていなかったため、すごく感動しました。

今回の例はエラーも表示できる

実は #7 の例を元に作ったものは、エラーに関するものは表示してくれませんでした。

ですが、今回作ったものはエラーの内容も表示するように出来ています。

RunWait の部分に 2>&1 を加える事で、エラーも出力する事を可能にしています。

#7 のを例に作った先程の例よりも、 今回作った例の方が便利に使えるものといえるでしょう。

そもそも、エラーの方の表示の方が重要ですし。

諸注意

「コマンドプロンプトと同じ様な事ができるもの」はとりあえず出来ました。

出来たのはいいのですが、あくまで似たようなものが出来るという感じで捉えた方がよいと思います。

本当にコマンドプロンプトと同じ様な事ができるかどうかは怪しいです。
あくまで遊びの範囲で使う程度にしてください。
TRR全体に対していえる事ですが。

わたくしブランボンも TRR を使ってコマンドプロンプトと同じ様な事をして使っていったりはしていません。

あまり信用はしない感じでとらえて、重要な処理とかは実行させない方がよいと思います。

使う事を警告しておいて何ですが、
今回の Alt+SAlt+W を使った場合、 TextRunRun のスクリプトを通して使う訳なので、 # #% % で囲まれた文字を使用する事が出来ます。

copy  readme.txt  #myFolder#

この様に、 アイテム のリンク先を使う事や、 %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 を起動すると サクラエディタ を出力先にできたので興味がある方は試してみてください。