Windows コマンドプロンプトで、パイプでつないだコマンドの終了コードを取得

パイプにつないだとあるコマンドの終了コードを読みたい。

しかし、パイプ後の %errorlevel% の中身は、パイプ先の最後のコマンドの終了コードになる。
また、パイプの中身は独立したプロセスになっているようで、この中でいくら環境変数の設定を行っても、消えてしまうのだ。

…となっては仕方ない、いったん一時ファイルに書き出した後、その値を読み出すしかない。

set tmplog=%TEMP%\errlv_%DATE:/=%%RANDOM%%RANDOM%.log
(cd d:\nonexist & call echo %^^errorlevel% ^>"%tmplog%") | sort
for /f "usebackq" %A in ("%tmplog%") do echo result %A
del "%tmplog%"

パイプの呼び出し時と、[cci_bash]all echo[/cci_bash] 時、そして実行時の 合計 3回 環境変数の展開が行われるので、最初の2回分を キャレットで回避しているのがミソ。

ちなみに、[cci_bash]cd d:\nonexist[/cci_bash] は、フォルダが存在しない場合に errorlevel が返されるのを利用したもので、 [cci_bash]sort[/cci_bash] はパイプで文字を受け取るデモになっている。(一行だけなので意味は無いけど…)

ただし、バッチファイルに書くときは、以下の様に [cci_bash]%[/cci_bash] を重ねて書かなくてはならないので注意。

set tmplog=%TEMP%\errlv_%DATE:/=%%RANDOM%%RANDOM%.log
(cd d:\nonexist & call echo %%^^errorlevel%% ^>"%tmplog%") | sort
for /f "usebackq" %%A in ("%tmplog%") do echo result %%A
del "%tmplog%"

続きを読む

64bit 環境で AutoHotkey の ThumbRemap を動かす

タッチパッドの革新的な操作感を提供する、 ThumbSense というソフトがあるのだが、これには中クリックを実現できない欠点があった。
そこで、AutoHotkey を利用して、スクリプトで自由にキーを割り当てつつ、 ThumbSense の機能を実現してしまおうという、 ThumbRemap.ahk というものが存在する。
(オリジナルの配布もとは既に無くなっており、ミラーサイトで配布中 → 残念ながら、ミラーサイトからは拾えなくなってしまったようだ。 ただ、 元サイトの Wayback Machine で拾える模様

これ自体もなかなか古く、最新の 64bit OS で 普通に AutoHotkey を導入してしてもおそらく動かないだろう。

続きを読む