【CMD】環境変数PATHEXT -拡張子なしで実行できる理由-

コマンドプロンプト

コマンドプロンプトから実行ファイルを呼び出す際、.exe.bat など一部の拡張子は省略して実行することができます。これは、環境変数 PATHEXT の設定によるものです。

環境変数 PATHEXT とは

実行ファイルとみなす拡張子の一覧です。デフォルトでは以下11種類の拡張子が、;区切りで設定されています。拡張子を省略して実行ファイルが指定された場合、ここに設定された拡張子を先頭から順に確認し、一致した場合にそのファイルを実行します。

$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

PATHEXT変数には、Windows が実行可能ファイルと見なすファイル拡張子の一覧が含まれています。

about_Environment_Variables > パス情報

PATHEXT 環境変数の値を使用して、検索する拡張子とその順序が決定されます。 PATHEXT 変数の既定値は、.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC です。

構文は、各拡張機能を分離することをセミコロン (;) で区切って、パス変数と同じことに注意してください。

start > 解説

これにより、拡張子を含めることなくコマンド実行が可能になります。(EXT は「Extension:拡張子」の略語と思われます。)

# 本来は絶対パスで実行ファイルを指定する必要がある
$ C:\Users\xxx\workspace\sample\greet.bat
Hello World

# 環境変数 PATH によってパスの指定は不要になる
$ greet.bat
Hello World

# 環境変数 PATHEXT によって拡張子も不要になる
$ greet
Hello World
環境変数 PATH の詳細はこちらです。

サンプルを用いた挙動の確認

以下のような「Hello World(+ファイル拡張子)」を出力する greet.batgreet.cmd を用意して、どのような挙動になるか確認してみます。

greet.bat
@echo off
echo Hello World (.bat)
greet.cmd
@echo off
echo Hello World (.cmd)
# 上記2ファイルを配置したディレクトリで検証
$ dir

 C:\Users\xxx\workspace\sample のディレクトリ

YYYY/MM/DD  hh:mm                38 greet.bat
YYYY/MM/DD  hh:mm                38 greet.cmd

# greet.bat を実行すると「Hello World (.bat)」が出力される
$ greet.bat
Hello World (.bat)

# greet.cmdを実行すると「Hello World (.cmd)」が出力される
$ greet.cmd
Hello World (.cmd)

拡張子を指定せずにコマンド実行すると、環境変数 PATHEXT に設定された拡張子のうち、先頭に近いほうが実行されることが確認できます。

# PATHEXT には「.BAT」→「.CMD」の順に設定されている
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

# 拡張子を省略した場合は greet.bat が実行される
$ greet
Hello World (.bat)

また、環境変数 PATHEXT に該当する拡張子が存在しない場合はエラーとなります。

# 既存のPATHEXT
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

#「.BAT;.CMD;」を空文字に置換(=削除)
$ set PATHEXT=%PATHEXT:.BAT;.CMD;=%

# PATHEXT から「.BAT」と「.CMD」が削除されたことを確認
$ set PATHEXT
PATHEXT=.COM;.EXE;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

# 拡張子を省略するとエラーになる
$ greet
'greet' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
環境変数の値の置換や一部削除の方法はこちらに記載しています。
タイトルとURLをコピーしました