S-JIS[2006-07-13] 変更履歴

MS-DOSのaliasもどき

WindowsXPのコマンドプロンプトで動く、UNIXのaliasもどきのエイリアス定義用バッチファイル。

UNIXのaliasに相当するコマンドとしては、doskeyがある。
が、aliasは、一覧を表示したり特定のエイリアスだけを表示したり出来る。
これを実行できるaliasコマンドをdoskeyで別名定義してみた。

以下の内容をバッチファイルとして保存し、コマンドプロンプトを起動した最初に実行すれば、以降aliasとunaliasが使えるようになる。

>alias			…エイリアスの一覧表示
alias=〜
unalias=doskey $*=

>alias ls=dir/w $*		…エイリアスの定義

>alias ls			…特定エイリアスの内容表示
ls=dir/w $*

>unalias ls		…エイリアスの削除
>ls
'ls' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

set_alias.bat

@echo off

doskey alias=if "$1"=="" (doskey /macros) else ^
for /f "delims== tokens=1,*" %%i in ("$*") do^
 @if "%%j" neq "" (^
  doskey $*^
 ) else (^
  doskey /macros ^| findstr /b /c:"%%i="^
 )

doskey unalias=doskey $*=

作りは、以下のような感じ。

  1. 引数が無い場合($1が空文字)は、全エイリアスの表示。
    これは「doskey /macros」を実行する。
  2. 引数に「=」が入っている場合は、エイリアスの定義。
    これを判断するには、「for /f」を利用して「=」の前後に単語を分け(「delims==」)、後半(%j)が空かどうかを調べている。
    空でなければ「=」があるということなので、元の引数を使ってエイリアス定義「doskey $*」を実行する。
  3. 上記以外の場合は エイリアス名だけ指定された場合なので、特定エイリアスの内容表示。
    doskeyには指定されたエイリアスだけを表示するオプションが無いので、全て表示した上でfindstrを使って特定のものだけを抽出する。
    findstrの「/b」が指定されたものが行頭にあるかどうかを調べるオプションで、「/c:」がマッチさせたい文字列を指定するオプション。この文字列に%i(デリミターの「=」が無かったので、%iに全引数が入っているはず)と「=」(マッチさせたい最後尾の文字)を結合させたものを指定している。

なお、各行の行末の「^」は、次の行へ継続していることを表す。
普通、丸括弧を使って複数コマンドを書いている場合は行継続文字は不要だが、今回はあくまで「doskey」コマンドの定義であり、ifやらelseやらの部分はdoskeyの引数(単なる文字列)でしかないので、丸括弧の構文であるとは見なされない。

ただし、途中の「|」だけは違う。これはdoskeyの終わりと認識されてしまうので、「^」を付けてエスケープしている。


DOSコマンドへ戻る / 自作ソフトへ戻る / 技術メモへ戻る
メールの送信先:ひしだま