[前の記事]« [座布団10枚!?]テキストファイルの重複行を削除する方法
[次の記事]複数の環境変数を実行ファイルの引数として使用する方法 »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「バッチファイルの文法と環境変数」索引へ

バッチファイルがループしてしまう

920.
バッチファイルによるインストール方法
2006年01月12日(木) 18時27分
フォレスト
●DOS/Windowsのバージョン↓
Windows 98

はじめまして。
バッチファイルを書くのははじめてで、いろいろと調べてみましたがよくわかりません。
どなたかご存知の方がいたら教えてください。
よろしくおねがいします。

バッチファイルの目的
・Microsoft .NET Framework 1.1
・Microsoft .NET Framework 1.1 Service Pack
・Microsoft .NET Framework Language Pack
以上3点をサイレントインストールすること
(インストールする際に、上記3点がインストールされているかの確認、インストーラーが所定の場所にあることの確認なども行います)

今回、インストール対象のOSはWin98,Me,NT,XP,2000の5つで、手元にあるものはWin98,XP,2000のみです。
WinXP,2000に関しては作成でき、動作確認もとれたのですが、Win98に関してのバッチファイルがうまくいきません。

不具合の現象として、
・上記の3点がインストール済みの場合、バッチファイルの最後までいっても、プロンプト画面が消えない
・上記3点がすべてインストールされていない場合、バッチファイルの最後までいっても、なぜかループ?して同じ動作を繰り返す

ほかにも不具合がでてくるかもしれないです・・・

以下に私の書いたWin98用のバッチファイルの一部を載せます。

乱筆・乱文になりすいません。

REM Microsoft .NET Framework 1.1 Japanese Language Packがインストールされている場合
if exist %windir%\Microsoft.NET\Framework\v1.1.4322\JA\InstallUtil.resources.dll goto END_LP

REM Microsoft .NET Framework 1.1 Japanese Language Packがインストールされていない場合
    REM インストーラーが%DIR%にない場合
    if NOT exist %DIR%\langpack.exe goto ERROR_LP_1
    
    REM インストーラーが%DIR%にある場合
    echo ************************************************************** >> %LOG%\%LOGFILE%
    echo .NET Framework Language Packのインストールを開始します。
    echo .NET Framework Language Packのインストールを開始します。 >> %LOG%\%LOGFILE%
    start /wait %DIR%\langpack.exe /q:a /c:"inst /l/q"
    
    REM インストールが失敗した場合
    if NOT exist %windir%\Microsoft.NET\Framework\v1.1.4322\JA\InstallUtil.resources.dll goto ERROR_LP_2
    
    REM インストールが成功した場合
    echo .NET Framework Language Packのインストールを終了しました。
    echo .NET Framework Language Packのインストールを終了しました。 >> %LOG%\%LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOG%\%LOGFILE%
    echo ************************************************************** >> %LOG%\%LOGFILE%
    goto NEXT_SP

    
:END_LP
    echo ************************************************************** >> %LOG%\%LOGFILE%
    echo .NET Framework Language Packはインストール済みです。
    echo .NET Framework Language Packはインストール済みです。 >> %LOG%\%LOGFILE%
    echo ************************************************************** >> %LOG%\%LOGFILE%
    goto NEXT_SP

:ERROR_LP_1
    echo ************************************************************ >> %LOG%\%LOGFILE%
    echo %DIR%にLanguage Packのインストーラーがありません。
    echo %DIR%にLanguage Packのインストーラーがありません。 >> %LOG%\%LOGFILE%
    echo インストーラーを配置してからもう一度実行してください。 >> %LOG%\%LOGFILE%
    echo ************************************************************ >> %LOG%\%LOGFILE%
    goto END

:ERROR_LP_2
    echo .NET Framework Language Packのインストールに失敗しました。
    echo .NET Framework Language Packのインストールに失敗しました。 >> %LOG%\%LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOG%\%LOGFILE%
    echo ************************************************************** >> %LOG%\%LOGFILE%
    goto NEXT_SP
926.
Re:バッチファイルによるインストール方法
2006年01月13日(金) 14時54分
otn
>不具合の現象として、
>・上記の3点がインストール済みの場合、バッチファイルの最後までいっても、プロンプト画面が消えない

これは確か仕様だと思います。プロパティーもしくはショートカットのプロパティーで、「プログラム終了時にウィンドウを閉じる」というチェックボックスがありませんか?

>・上記3点がすべてインストールされていない場合、バッチファイルの最後までいっても、なぜかループ?して同じ動作を繰り返す

NEXT_SPというラベルが無いですが、まだ続きがあるのでしょうか?
@echo offとしなければ、流れを追ってループの箇所は突き止められると思います。
929.
Re:バッチファイルによるインストール方法
2006年01月13日(金) 15時07分
YanaKen◆c0rnJ1Q=
フォレストさん

>・上記の3点がインストール済みの場合、バッチファイルの最後までいっても、プロンプト画面が消えない
>・上記3点がすべてインストールされていない場合、バッチファイルの最後までいっても、なぜかループ?して同じ動作を繰り返す

 いずれも「バッチファイルの最後のほう」に何か問題があることをうかがわせるご説明ですが、拝見したところでは、紹介されているバッチファイルには肝心の「最後のほう」の内容(NEXT_SPやENDといったラベルのあるあたり?)が見当たりません。
 そのためコメントの余地があまりないのですが、一般論として「無限ループに陥ってしまうケース」については、GOTOの飛び先の設定に問題があるか、バッチファイル名自体が通常のコマンド名と重なっているなどの原因が考えられるかと思います。
 要所要所にPAUSEを入れて段階的に確認したり、ECHOコマンドで変数の内容を表示させてチェックするなど、もうひとまわりデバッグの工夫(該当の現象が発生する際、一体何が起きているのかの確認)をされてはと思います。

 あと、「プロンプト画面が消えない」というほうは、いまひとつ趣旨がわからないのですが、「処理が完了した際、(動作させた端末によって?)ウィンドウが残る場合とそうでない場合がある」ということでしょうか。
 Windows95系のコマンド・プロンプトの機能として、「終了後もウィンドウを消さない」という設定は存在しますので、その状態になっているだけなんじゃないかとも思われますが。

YanaKen
930.
Re:バッチファイルによるインストール方法
2006年01月13日(金) 15時09分
YanaKen◆c0rnJ1Q=
うへ。絶妙なタイミングでotnさんとコメントがかぶっちゃいました。
 内容的には同じ趣旨を回りくどく書いてるだけな気がしますが(とほほ)、せっかく書いたのでそのままにしておきます(^^;。
932.
Re:バッチファイルによるインストール方法
2006年01月13日(金) 18時18分
フォレスト
otnさん、YanaKenさん返信ありがとうございます。

>・上記の3点がインストール済みの場合、バッチファイルの最後までいっても、プロンプト画面が消えない

この趣旨は処理が終了したら、ウィンドウを閉じたいということです。
これはのプロパティーで、「プログラム終了時にウィンドウを閉じる」にチェックを入れたら解決できました。

>・上記3点がすべてインストールされていない場合、バッチファイルの最後までいっても、なぜかループ?して同じ動作を繰り返す

こちらに関しては御二方のご指摘の通りファイルの一部の内容しかなく、わかりずらかったと思い反省しています。

全内容は以下の通りです。

@echo off
REM *************************
REM ユーザ設定変数
REM *************************
REM ログ出力ディレクトリ
set LOG=C:\NET_Framework\LOG
REM インストーラ配置ディレクトリ
set DIR=C:\NET_Framework

REM **********************************
REM ログファイル名の設定
REM **********************************
set LOGFILE=%LOG%\%USERNAME%_install.log

REM **********************************
REM 環境変数の設定
REM **********************************
set TMP=
set TMP=%LOG%
set TEMP=
set TEMP=%LOG%

REM *******************************************
REM Microsoft .NET Framwork 1.1 のインストール
REM *******************************************

REM Microsoft .NET Framework 1.1がインストールされている場合
if exist %windir%\Microsoft.NET\Framework\v1.1.4322\InstallUtil.exe goto installed_fw

REM Microsoft .NET Framework 1.1がインストールされていない場合
   REM インストーラーが%DIR%にない場合
    if not exist %DIR%\dotnetfx.exe goto error_fw_1
    
    REM インストーラーが%DIR%にある場合
    echo ************************************************************** > %LOGFILE%
    echo .NET Framework 1.1のインストールを開始します。 >> %LOGFILE%
    start /wait %DIR%\dotnetfx.exe /q:a /c:"install /l/q"
    
    REM インストールに失敗
    if NOT exist %windir%\Microsoft.NET\Framework\v1.1.4322\InstallUtil.exe goto next_fw goto error_fw_2

   REM インストールに成功
    echo .NET Framework 1.1のインストールを終了します。 >> %LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto NEXT_LP
    
:installed_fw
    echo ************************************************************** > %LOGFILE%
    echo .NET Framework 1.1はインストール済みです。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto NEXT_LP
    
:error_fw_1
    echo ***************************************************************** > %LOGFILE%
    echo %DIR%にMicrosoft .NET Framework 1.1のインストーラーがありません。 >> %LOGFILE%
    echo インストーラーを配置してからもう一度実行してください。 >> %LOGFILE%
    echo ***************************************************************** >> %LOGFILE%
    goto END
    
:error_fw_2
    echo .NET Framework 1.1のインストールに失敗しました。 >> %LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto END

:NEXT_LP
REM ************************************************************************************
REM Microsoft .NET Framework 1.1 Japanese Language Packのインストール
REM ************************************************************************************

REM Microsoft .NET Framework 1.1 Japanese Language Packがインストールされている場合
if exist %windir%\Microsoft.NET\Framework\v1.1.4322\JA\InstallUtil.resources.dll goto end_jp

REM Microsoft .NET Framework 1.1 Japanese Language Packがインストールされていない場合
   REM インストーラーが%DIR%にない場合
    if NOT exist %DIR%\langpack.exe goto error_jp_1
    
    REM インストーラーが%DIR%にある場合
    echo ************************************************************** >> %LOGFILE%
    echo .NET Framework Language Packのインストールを開始します。 >> %LOGFILE%
    start /wait %DIR%\langpack.exe /q:a /c:"inst /l/q"
    
    REM インストールが失敗した場合
    if NOT exist %windir%\Microsoft.NET\Framework\v1.1.4322\JA\InstallUtil.resources.dll goto error_jp_2
   
    REM インストールが成功した場合
    echo .NET Framework Language Packのインストールを終了しました。 >> %LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto NEXT_SP

    
:end_jp
    echo ************************************************************** >> %LOGFILE%
    echo .NET Framework Language Packはインストール済みです。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto NEXT_SP

:
    echo ************************************************************ >> %LOGFILE%
    echo %DIR%にLanguage Packのインストーラーがありません。 >> %LOGFILE%
    echo インストーラーを配置してからもう一度実行してください。 >> %LOGFILE%
    echo ************************************************************ >> %LOGFILE%
    goto END

:error_jp_2
    echo .NET Framework Language Packのインストールに失敗しました。 >> %LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto NEXT_SP


:NEXT_SP
REM ************************************************************************************
REM Microsoft .NET Framework 1.1 Service Packのインストール
REM ************************************************************************************

REM Service Packがインストールされている場合
if exist %windir%\Microsoft.NET\Framework\v1.1.4322\Updates goto installed_sp

REM Service Packがインストールされていない場合
   REM インストーラーが%DIR%にない場合
    if NOT exist %DIR%\NDP1.1sp1-KB867460-X86.exe goto error_sp_1
    
    REM インストーラーが%DIR%にある場合
    echo ************************************************************** >> %LOGFILE%
    echo .NET Framework SP1のインストールを開始します。 >> %LOGFILE%
    start /wait %DIR%\NDP1.1sp1-KB867460-X86.exe /l:%LOG%\NET_Framework_SP1_install.log /q:a

    REM インストールに失敗した場合
    if NOT exist %windir%\Microsoft.NET\Framework\v1.1.4322\Updates goto installed_sp goto error_sp_2

    REM インストールに成功した場合
    echo .NET Framework SP1のインストールを終了しました。 >> %LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto END

:installed_sp
    echo ************************************************************** >> %LOGFILE%
    echo .NET Framework SP1はインストール済みです。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto END

:error_sp_1
    echo *********************************************************** >> %LOGFILE%
    echo %DIR%にService Packのインストーラーがありません。 >> %LOGFILE%
    echo インストーラーを配置してからもう一度実行してください。 >> %LOGFILE%
    echo *********************************************************** >> %LOGFILE%
    goto END

:error_sp_2
    echo .NET Framework SP1のインストールに失敗しました。 >> %LOGFILE%
    echo 詳細はログファイルを参照してください。 >> %LOGFILE%
    echo ************************************************************** >> %LOGFILE%
    goto END

:END

このように、.NET Framework→Language Pack→Service Packの順にインストールを行うというようなものです。
これを実行した際、プロンプト上に表示させているechoメッセージは、
○○のインストールを開始します
○○のインストーラーがありません
インストーラーを配置してからもう一度実行してください。

という表示がされ続けます。
動作自体何かおかしい・・・
ラベルの指定も上の処理に戻るようには設定していないはずなのですが・・・

もう少し調べてみます。
934.
Re:バッチファイルによるインストール方法
2006年01月13日(金) 18時26分
フォレスト
すいません。
一部ラベルが消えてるとこがありました。

>:

のところは

:error_jp_1

です
 
 


カテゴリー「バッチファイルの文法と環境変数」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2006年01月12日 14:43に投稿されたエントリーのページです。

ひとつ前の投稿は「[座布団10枚!?]テキストファイルの重複行を削除する方法」です。

次の投稿は「複数の環境変数を実行ファイルの引数として使用する方法」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート