始まり
ipconfig
を実行するためのbatファイルを作成する際、batファイル名を考えるのが面倒で、「ipconfig.bat」としました。しかし、それが後に問題を引き起こすことになりました。
起こったこと
batファイルを実行すると、コマンドプロンプトに以下のメッセージが永遠に表示されました。batファイルが処理を完了せず、ipconfig
の実行もされていないようでした。
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ファイルの名称がコマンドと同じでないことが重要です。
補足
コード5行目の
ipconfig
がipconfig /all
であっても、結果は同じです。「ipconfig.bat」が繰り返し呼び出される動作に変わりありません。setlocal
やcd /d %~dp0
がなくても、同じ問題が発生します。調べたところ、
ping
コマンドで同様の問題に直面した人が記事を書いているようですね。 バッチファイルの名前には注意 | にわかSEは大忙し!(情報政策室ブログ)
蛇足の深掘り
コマンドと同じ名前の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」が実行されます。