CD-ROMからコピーしたインストーラーがバッチ実行で動かない原因と対処法

Windows
記事内に広告が含まれています。

はじめに

日立製作所のミドルウェアなど、業務系ソフトウェアをインストールするときに、CD-ROMやインストール媒体の中身をいったんローカルフォルダへコピーしてから実行することがあります。

たとえば、次のような流れです。

C:\Temp\HITACHI_MW\

このようなローカルフォルダにCD-ROMの中身をコピーして、そこにあるインストーラーや起動用ファイルを実行する。

ところが、ここで少しやっかいな問題が起きることがあります。

エクスプローラーから HCD_INST.EXE をダブルクリックすると起動する。
しかし、バッチファイルから HCD_INST.EXE を実行するとエラーになる。

このようなケースです。

一見すると、

「ファイルは存在しているのに、なぜバッチからだと動かないのか?」

と悩んでしまいます。

結論から言うと、この場合はカレントディレクトリが原因になっていることがあります。

症状:エクスプローラーからは起動するのにバッチではエラーになる

今回のようなケースでは、次のような状況になります。

C:\Temp\HITACHI_MW\HCD_INST.EXE

このファイルをエクスプローラーから直接ダブルクリックすると、インストーラーが起動する。

しかし、別の場所に置いたバッチファイルから次のように実行すると失敗する。

C:\Temp\HITACHI_MW\HCD_INST.EXE

または、

start C:\Temp\HITACHI_MW\HCD_INST.EXE

このようにフルパスで指定しているにもかかわらず、インストーラーが正常に起動しないことがあります。

ここでハマりやすいのが、

「フルパスでEXEを指定しているのだから問題ないはず」

と思ってしまうことです。

しかし、Windowsのプログラムによっては、EXEファイルの場所だけでなく、実行時のカレントディレクトリを前提にして動くものがあります。

原因:EXEの場所とカレントディレクトリは別物

バッチファイルで重要なのは、次の2つは別物だという点です。

  • 実行するEXEファイルの場所
  • 実行時のカレントディレクトリ

たとえば、次のようなバッチを考えます。

C:\Temp\HITACHI_MW\HCD_INST.EXE

この場合、実行しているEXEはたしかに、

C:\Temp\HITACHI_MW\HCD_INST.EXE

です。

しかし、カレントディレクトリは必ずしも、

C:\Temp\HITACHI_MW

になっているとは限りません。

たとえばバッチファイルを次の場所から実行していた場合、

C:\Work\install.bat

カレントディレクトリは、

C:\Work

のままになっていることがあります。

この状態で HCD_INST.EXE が起動すると、インストーラー側は自分の周辺にある設定ファイルや関連ファイルを探すときに、想定外の場所を見に行ってしまう場合があります。

その結果、

  • 必要なファイルが見つからない
  • セットアップ情報を読み込めない
  • インストーラーが途中で止まる
  • エラー画面が表示される
  • 何も起動しないように見える

といった現象が起きます。

なぜエクスプローラーからだと動くのか

エクスプローラーで HCD_INST.EXE が置かれているフォルダを開き、そこからダブルクリックした場合、実行時の前提が比較的自然な形になります。

つまり、インストーラーが存在するフォルダを基準にして、同じフォルダ内の関連ファイルを参照できる状態になりやすいです。

一方、バッチファイルからフルパスでEXEだけを呼び出した場合、実行ファイルの場所は合っていても、カレントディレクトリが違うままになることがあります。

この違いが、

「手で実行すると動くのに、バッチだと動かない」

という現象の原因になります。

確認ポイント

まず、バッチファイルの中で現在のカレントディレクトリを確認してみます。

@echo off
cd
pause

または、

@echo off
echo 現在のカレントディレクトリは %CD% です
pause

このバッチを実行すると、現在どのフォルダを基準にして処理しているかが分かります。

たとえば、インストーラーの実体が次の場所にあるとします。

C:\Temp\HITACHI_MW\HCD_INST.EXE

しかし、バッチ実行時のカレントディレクトリが次のようになっていたら注意が必要です。

C:\Work

この状態でEXEだけをフルパス指定しても、インストーラーが想定通りに関連ファイルを見つけられない可能性があります。

正しい実行方法:カレントディレクトリを移動してから実行する

対処方法はシンプルです。

HCD_INST.EXE が置かれているフォルダに移動してから実行します。

@echo off

cd /d C:\Temp\HITACHI_MW
HCD_INST.EXE

pause

ポイントは cd /d を使うことです。

通常の cd だけだと、ドライブをまたぐ移動がうまくいかないことがあります。

たとえば、現在の場所が D:\Work で、移動先が C:\Temp\HITACHI_MW の場合、次のような書き方では期待通りに移動できないことがあります。

cd C:\Temp\HITACHI_MW

そのため、バッチファイルでは次のように書くのが安全です。

cd /d C:\Temp\HITACHI_MW

これで、ドライブも含めてカレントディレクトリを移動できます。

おすすめのバッチ例

実際の運用では、次のように書いておくと分かりやすいです。

@echo off
setlocal

rem インストーラーを配置したフォルダ
set INSTALL_DIR=C:\Temp\HITACHI_MW

rem インストーラーフォルダへ移動
cd /d "%INSTALL_DIR%"

rem カレントディレクトリ確認
echo 現在のカレントディレクトリ: %CD%

rem インストーラー実行
HCD_INST.EXE

pause
endlocal

フォルダパスに空白が含まれる可能性もあるため、変数を使う場合はダブルクォーテーションで囲んでおくのが安全です。

cd /d "%INSTALL_DIR%"

このようにしておけば、たとえば次のようなパスでもエラーを避けやすくなります。

C:\Temp\Hitachi Middleware\

startコマンドを使う場合の注意点

start コマンドで実行する場合も注意が必要です。
次のように書くと、カレントディレクトリの問題が残ることがあります。

start C:\Temp\HITACHI_MW\HCD_INST.EXE

この場合も、先に対象フォルダへ移動してから実行する方が安全です。

@echo off
cd /d C:\Temp\HITACHI_MW
start "" HCD_INST.EXE

start の直後にある "" はウィンドウタイトル用です。

これを省略すると、パスの解釈で思わぬ動きになることがあります。
特にパスに空白が含まれる場合は注意が必要です。

より安全に書くなら次の形です。

@echo off
setlocal

set INSTALL_DIR=C:\Temp\HITACHI_MW

cd /d "%INSTALL_DIR%"
start "" "HCD_INST.EXE"

endlocal

バッチファイル自身の場所を基準にする方法

インストール用バッチファイルを、HCD_INST.EXE と同じフォルダに置く運用なら、次の書き方も便利です。

@echo off
cd /d "%~dp0"
HCD_INST.EXE
pause

%~dp0 は、実行中のバッチファイルが置かれているフォルダを表します。

たとえば、次のような配置にします。

C:\Temp\HITACHI_MW\install.bat
C:\Temp\HITACHI_MW\HCD_INST.EXE

この場合、install.bat の中で、

cd /d "%~dp0"

と書いておけば、バッチファイル自身があるフォルダへ移動してから HCD_INST.EXE を実行できます。

ローカルフォルダ名が変わる可能性がある場合は、この方法が特に便利です。

実行前に確認したいこと

バッチでインストーラーを起動する前に、次の点を確認しておくとトラブルを減らせます。

CD-ROMの中身を丸ごとコピーしているか

インストーラー本体だけをコピーしていると、関連ファイルが足りない場合があります。

たとえば、

HCD_INST.EXE

だけをコピーするのではなく、CD-ROM内のフォルダ構成をそのままローカルへコピーします。

C:\Temp\HITACHI_MW\

配下に、元の媒体と同じ構成でファイルやフォルダが存在するか確認します。

カレントディレクトリが正しいか

バッチ内で次のように出力して確認します。

echo %CD%

HCD_INST.EXE が置かれているフォルダになっていれば問題ありません。

管理者権限が必要ではないか

ミドルウェアのインストールでは、管理者権限が必要になることがあります。
エクスプローラーから右クリックして「管理者として実行」している場合と、通常のバッチ実行では権限が違う場合があります。

ただし、今回の主なポイントは権限ではなく、カレントディレクトリの違いです。

権限を疑う前に、まずは cd /d で実行フォルダへ移動しているか確認するのがおすすめです。

ありがちな間違い

EXEをフルパスで指定すれば大丈夫だと思ってしまう

これはかなり多いです。

C:\Temp\HITACHI_MW\HCD_INST.EXE

このように書くと、一見正しく見えます。
しかし、プログラムによっては、起動後に同じフォルダ内のファイルを相対パスで参照します。
そのため、EXEのフルパス指定だけでは不十分なことがあります。

cdだけで移動している

次のような書き方です。

cd C:\Temp\HITACHI_MW

現在のドライブと移動先のドライブが同じなら動くこともあります。
しかし、別ドライブの場合にハマることがあります。

バッチでは基本的に次のように書いた方が安全です。

cd /d C:\Temp\HITACHI_MW

startコマンドの書き方があいまい

次の書き方もトラブルの元になります。

start "C:\Temp\HITACHI_MW\HCD_INST.EXE"

start コマンドでは、最初のダブルクォーテーション付き文字列がウィンドウタイトルとして扱われることがあります。

そのため、次のように空のタイトルを入れるのが定番です。

start "" "C:\Temp\HITACHI_MW\HCD_INST.EXE"

ただし、今回のようなケースでは、やはり先にフォルダ移動してから実行する方が安全です。

cd /d C:\Temp\HITACHI_MW
start "" HCD_INST.EXE

現場でのおすすめ手順

実際のシステム運用や構築作業では、次の流れにすると確認しやすいです。

  1. CD-ROMの中身をローカルフォルダへ丸ごとコピーする
  2. コピー先フォルダをエクスプローラーで開いて手動起動を確認する
  3. バッチファイルでは cd /d でコピー先フォルダへ移動する
  4. echo %CD% でカレントディレクトリを確認する
  5. HCD_INST.EXE をファイル名だけで実行する
  6. 必要ならログやエラー内容を残す

バッチ例は次の通りです。

@echo off
setlocal

set INSTALL_DIR=C:\Temp\HITACHI_MW

echo インストールフォルダへ移動します。
cd /d "%INSTALL_DIR%"

echo 現在のカレントディレクトリ:
echo %CD%

echo インストーラーを起動します。
HCD_INST.EXE

echo インストーラーが終了しました。
pause

endlocal

まとめ

CD-ROMの中身をローカルフォルダへコピーして、HCD_INST.EXE をバッチから実行したときにエラーになる場合は、まずカレントディレクトリを確認します。

エクスプローラーから実行すると起動するのに、バッチからだと動かない場合、原因はEXEのパスではなく、実行時のカレントディレクトリにあることがあります。

対処法は、インストーラーが置かれているフォルダへ移動してから実行することです。

cd /d C:\Temp\HITACHI_MW
HCD_INST.EXE

または、バッチファイルをインストーラーと同じフォルダに置くなら、次の書き方が便利です。

cd /d "%~dp0"
HCD_INST.EXE

Windowsのバッチでは、EXEをフルパスで指定することと、そのフォルダをカレントディレクトリにすることは別の話です。

インストーラーや古い業務系ミドルウェアでは、この違いが原因でハマることがあります。

「手で実行すると動くのに、バッチだと動かない」

そんなときは、まず cd /d で実行フォルダへ移動しているかを確認してみてください。


免責規定

この記事で提供される情報は、一般的なガイダンスを目的としており、すべての環境やシステムでの動作を保証するものではありません。
OSのバージョンやリリースによっては、記載されている事が実行できない、または異なる結果をもたらす可能性があります。
また、会社所有のパソコン、スマホ、タブレットなどでは、ポリシーや権限によって実行できない場合があります。
この記事の情報を使用することによって生じる問題や結果について、筆者およびサイト管理者は責任を負いません。
すべての操作は自己責任で行ってください。

もし、記事の中で間違いやご指摘があればコメントを頂けると大変ありがたいです。
最後までお読みいただきありがとうございました。
またお会いしましょう!

コメント

タイトルとURLをコピーしました