【失敗談】batファイル名をコマンドと同一にしたらbatがループした話

始まり


ipconfigを実行するためのbatファイルを作成する際、batファイル名を考えるのが面倒で、「ipconfig.bat」としました。しかし、それが後に問題を引き起こすことになりました。

起こったこと


batファイルを実行すると、コマンドプロンプトに以下のメッセージが永遠に表示されました。batファイルが処理を完了せず、ipconfigの実行もされていないようでした。

最大 setlocal 再帰レベルに到達しました。*1

batファイルのコード

簡略化していますが、batファイルのコードは以下のような感じです。

@echo off
setlocal
cd /d %~dp0

ipconfig

endlocal
pause

原因


5行目のipconfigの呼び出し先が、「ipconfig.exe」ではなくbatファイル自体(ipconfig.bat)になっていたことが原因でした。

その結果、「ipconfig.bat」が5行目まで繰り返し実行され、多重実行されたsetlocalのエラーが表示されたようです。

解決策


batファイル名を変更すれば問題が解決します。「ipconfig .bat」(ipconfigの後ろに半角空欄)でも同様の問題が発生せず、batファイルの名称がコマンドと同じでないことが重要です。

補足


蛇足の深掘り


コマンドと同じ名前のbatファイルが同じフォルダにあると、該当コマンドを使おうとするとbatファイルが起動してしまうことがわかりました。

①同じフォルダのbat
フォルダ構成
C:\test
     L ipconfig.bat
     L apple.bat

apple.batの内容は下記のように単純にしています。

ipconfig
pause

ipconfig.batの内容は前述の通りです。

apple.bat」をエクスプローラーでダブルクリックすると、「ipconfig.bat」が呼び出されます。

②別フォルダのbat
フォルダ構成
C:\test
    L ipconfig.bat
    L test2
        L apple.bat

フォルダが違う場合、「apple.bat」をエクスプローラーでダブルクリックしても、「ipconfig.bat」は呼び出されません。

代わりに通常通り「ipconfig.exe」が実行されます。

③カレントディレクトリが同じコマンドプロンプトから実行
フォルダ構成
C:\test
    L ipconfig.bat

コマンドプロンプトのカレントディレクトリをbatファイルと同じ「C:\test」に設定して、「ipconfig.bat」を実行すると、繰り返し「ipconfig.bat」が呼び出されます。

「ipconfig.bat」の実行ではなく、コマンドでipconfigを実行しても同じ結果です。

④カレントディレクトリが違うコマンドプロンプトから実行
フォルダ構成
C:\test
    L ipconfig.bat

例えばコマンドプロンプトのカレントディレクトリを「c:\users」にして、 C:\test\ipconfig.batを実行しても、繰り返し「ipconfig.bat」が呼び出されます。

C:\test\ipconfig.batの実行ではなく、コマンドでipconfigを実行した場合、一度も「ipconfig.bat」は呼び出されず「ipconfig.exe」が実行されます。


*1:コマンドプロンプト Microsoft Windows [Version 10.0.22631.2428]より引用