• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バッチコマンドでCD-ROMドライブレターを取得する方法)

バッチコマンドでCD-ROMドライブレターを取得する方法

このQ&Aのポイント
  • DOS窓で利用できるバッチファイルについてお尋ねします。データ配布用のCD-R上で動くBATファイルを作ろうとしています。
  • Cドライブ上でテストしたら正常に動作しますが、ドライブを異なるもの(D)に変えると「指定されたパスが見つかりません。」とエラーになってしまいます。
  • CDドライブの環境変数みたいなのがあれば、これを使えますがDOS自体を忘れかけています。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.9

>NT系のサービスパック スタンダードな方法は、 WMIを使う方法です。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__operating_systems.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_operatingsystem.asp サンプルそのままでサービスパックのバージョンが調べられます。 問題は、WMIが使えない場合があることです。 windows2000の場合使えたと思いますが、インストールが必要だったような気がします。(ちょっと記憶が定かではないですが、WMI自体は使えました) 管理者権限が必要です。 Win2000以前(NTや98等)のOSでは、サービスパックのバージョンのプロパティは使えません。(2番目の参考URLを読んで下さい) スタンダードではない方法に、レジストリから情報を読み出す方法があります。 例えば、2番目の参考URLのCSDVersion をレジストリから --------------------------------------------------------------- Dim WshShell, SPKey, CSDVer Set WshShell = WScript.CreateObject("WScript.Shell") SPKey= "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion" CSDVer = WshShell.RegRead(SPKey) WScript.Echo(CSDVer) ---------------------------------------------------------------- のようにして読み出すことができます。

vc-toku
質問者

補足

レジストリを読み取るという方法を使うと、OSやIEのバージョンも決められるようですね? WinXp/2k/98SEで動作確認できました。 先のOS決定方法をレジストリからの判定に置き換え、IEのバージョン判定も含めた上でインストールすべきAdobeReaderを決めるVBSを作ってみました。 評論をお願いしたいのですが… --------------------------------------------------------------- Option Explicit Dim WshShell,Msg,Os,Sp,Ie,Pdf Set WshShell = CreateObject("WScript.Shell") 'Pdf 1:707 2:601 3:505 Pdf = 0 Os = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName") Sp = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion") Ie = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Internet Explorer\Version") 'OSの判定 If Os = "Microsoft Windows XP" Then Os = "Xp" Else If Os = "Microsoft Windows 2000" Then Os = "2k" Else Os = "98" End If End If 'OS SPの判定 If Sp >= "Service Pack 4" Then Sp = "SP4" Else If Sp = "Service Pack 3" Then Sp = "SP3" Else If Sp = "Service Pack 2" Then Sp = "SP2" Else If Sp = "Service Pack 1" Then Sp = "SP1" Else Sp = "" End If End If End If End If 'IEバージョンの判定 If Left(Ie,3) = "5.0" Then 'IE5.0 or 5.01の判定 If Mid(Ie,6,4) >= "2919" And Mid(Ie,6,4) <= "3700" Then Ie = "5.01" Else Ie = "5.0" End If Else Ie = left(Ie,3) 'IE5.5 or 6.0 End If 'PDFの判定 If ( Os = "Xp" or ( Os = "2k" And Sp >= "SP2" ) ) Then 'WinXp 又は2kSP2以降 If Ie >= "5.5" Then Pdf = 1 If Ie = "5.01" Then Pdf = 2 If Ie = "5.0" Then Pdf = 3 End If If Os = "2k" And Sp = "SP1" Then 'Win2kSP1 If Ie > "5.5" Then Pdf = 2 Else Pdf = 3 End If End If If Os = "2k" And Sp = "" Then Pdf = 3 'Win2k If Os = "98" And Ie >= "5.5" Then Pdf = 2 'Win98 IE5.5以降 If Os = "98" And Ie < "5.5" Then Pdf = 3 'Win98 IE5.5以前 'Msg = Os & ":" & Sp & ":" & Ie & ":" & Pdf 'Wscript.Echo Msg

その他の回答 (9)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.10

>評論をお願いしたいのですが… ごめんなさい。 コレで、ちゃんと望むように動作するというのであれば、いいんじゃないですか、ぐらいのことしか言えません。 ただ、 #9でもちょっと言ってますが、レジストリを直接読む方法は、 スタンダードな方法ではないということに注意しておく必要があります。 そうそう変わったりするものではない、ということは判っていますが、 公式な表明があって使えるという保証があるわけではないからです。 その点でいうと、WMIによるインターフェースを通じてアクセスした場合、実際には、レジストリを読んでいようと、また別の情報を読んでいようと同じように情報が提供されるということが大事です。 ある日突然様式が(ほんの少し?)変わってスクリプトが動かなくなるかもしれません。そういう心づもりはしておく必要があります。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

>ActiveXコンポーネントはオブジェクトを作成できません おそらく、IEでActiveXが使用できないように設定されているためです。 (ブラウザ上で無制限に許可するのは危険なので) HTAにしてローカルで実施する場合には、問題ないと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#6>どちらの方法が汎用性があると云えますか? >Drive = Mid(location.href,9,2) 'file:///Q:\… ex) "Q:" >Drive = left(WScript.ScriptFullName,2) の違いは、スクリプトの起動環境(ブラウザ上であるか、WSH上であるか)の違いであって、汎用性という面では大して代わりはないと思います。 HTML(HTA)を利用するのがウィンドウフォームが表示されるので、ユーザーフレンドリー(?)と言えるかもしれません。 一方バッチとVBScriptでは、 VBScriptは、コマンドプロンプト上でも動作させることができますし、 OSによって動作が変わらない(コマンドが同じ、環境変数の取得などは当然変わるが・)ので VBScriptによる方法の方がより汎用性があると言えると思います。 使用環境についても、IEが導入されていればほぼ使えると考えて良いと思います。

vc-toku
質問者

補足

先の方法で大体上手くいっていますが、今度はもう少し発展させてNT系のサービスパックによって処理を分けられたらと考えています。 特にWindows2000の場合ですが、SETコマンドで確認するとサービスパックを示す変数は無いようなので、VBscriptでは可能でしょうか? ちょっと本題から外れてしまいすみません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>先のVBscriptで、窓を開かず実行してすぐ終わるように修正するには、どこに手を加えれば良いでしょうか? つまり、HTML形式にはしないということですね。 selprog.vbs ---------------------------------------------------------------- Dim WShell, Env, OS, Drive, prog Set WShell = CreateObject("WScript.Shell") Set Env =WShell.Environment("Process") OS = Env.Item("OS") Drive = left(WScript.ScriptFullName,2) 'MsgBox "起動ドライブ" & Drive If OS <>"" Then 'NT系列にはOS環境変数がある prog= Drive & "\PRESEN\AdobeReader\win2kXp\AdbeRdr707_ja_JP.exe" Else prog= Drive & "\PRESEN\AdobeReader\Win98SE\AdbeRdr60_jpn_full.exe" End If 'MsgBox prog WShell.Run prog

vc-toku
質問者

お礼

既存HTMLに埋め込んでエラーとなってしまいましたので、こちらの方法を試しましたら、WIndows98/2k/Xpそれぞれ上手くいきました。 ありがとうございます。 どちらの方法が汎用性があると云えますか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>ここから先は、どうやれば良いのか分かりません。 ここから先って、例えばどんなことでしょうか? リンクじゃなくてボタンにするには、 <button type="button" onclick="execute()">プログラム起動</button> にすれば、いいです。 >既存のHTML文書へ埋め込む方法 <script language="VBScript"> ~ </script> の部分を </head> の前に挿入すれば良いです。

vc-toku
質問者

お礼

教えて戴きました通りに、既存のHTMLに埋め込んでみましたら次のようなエラーになってしまいました。 'Microsoft VBScript 実行時エラー:ActiveXコンポーネントはオブジェクトを作成できません。:'WScript.Shell"の種類の例外はハンドルできません。

vc-toku
質問者

補足

参考までに、前回のVBscriotで教えて下さい。 先のVBscriptで、窓を開かず実行してすぐ終わるように修正するには、どこに手を加えれば良いでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>そんなことをやってるよりも、スクリプトで組んだほうが早いですか? そうですね、スクリプトの場合、IE(5以上だっけ?)がインストールされていれば同じように使えます。

vc-toku
質問者

補足

既存のHTML文書へ埋め込む方法が分からなかったので、外部のVBSを呼び出して実行する事は出来ないかと、下の部分「Dim」~「WShell.Run prog」をvbsファイルとして書き出してみましたら、エラーになってしまいました。 「location」のオブジェクトが見つからないとか… 当たり前なんでしょうけど、私には良く分かりませんでした。 何度も何度もすみません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>HTMLの中に埋め込めれば嬉しいですが、可能だと思われますか? もちろんできます。 前出のHTMLとは別に試しに作成してみました。 (未テストですが・・) --------------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS"> <title>OS別のプログラム起動</title> <script language="VBScript"> <!-- sub execute() Dim WShell, Env, OS, Drive, prog Set WShell = CreateObject("WScript.Shell") Set Env =WShell.Environment("Process") OS = Env.Item("OS") Drive = Mid(location.href,9,2) 'file:///Q:\… ex) "Q:" 'MsgBox "起動ドライブ" & Drive If OS <>"" Then 'NT系列にはOS環境変数がある prog= Drive & "\PRESEN\AdobeReader\win2kXp\AdbeRdr707_ja_JP.exe" Else prog= Drive & "\PRESEN\AdobeReader\Win98SE\AdbeRdr60_jpn_full.exe" End If 'MsgBox prog WShell.Run prog end sub '--> </script> </head> <body> <span style="text-decoration:underline;color:red;" onclick="execute()">プログラム起動</span> </body> </html> ---------------------------------------------------------------- 以上の囲まれた部分を、selectPG.hta とかの名前で保存してテストしてみて下さい。 スクリプト以外の部分は、普通のHTMLとして記述すればスタイルを変更追加できます。 また、開いた時に自動的に実行させることもできます。

vc-toku
質問者

補足

こちらのスクリプトを試したら、プログラム起動が表示されクリックしたら起動させることが出来ました。 でもここから先は、どうやれば良いのか分かりません。 「HTMLの中に埋める」とは、自分が作ったHTMLページの中に埋め込むことが出来るという意味ですか? 例えば、今はリンクをクリックしてバッチを動かすようになっていますが、同様に出来るのでしょうか? ボタンとかスクリプトを作った事無いのです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

CD-ROMドライブというより起動ドライブがわかればいいんですよね。 2k/Xpの場合(98未確認) echo %~d0 でバッチの起動ドライブを調べることができます。 それができない場合は、VBScriptを使って 例えば DRIVE.vbs -----8<-----8<-----8<-----8<-----8< Dim drive drive = left(WScript.ScriptFullName,1) WScript.Quit(Asc(drive)-Asc("A")) -----8<-----8<-----8<-----8<-----8< を作って CScript //nologo DRIVE.vbs echo %ERRORLEVEL% のようにすれば ERRORLEVELで A:0 B:1 C:2 D:3 のようにドライブを数値で得ることができます。

vc-toku
質問者

お礼

ありがとうございます!できました! 全てのバッチファイルの中に記述したファイルパスの先頭に「%~d0」と付加した事によって、正常に動かす事が出来ました。 欲を言えばご紹介戴きましたVBScriptのように、HTMLの中に埋め込めれば嬉しいですが、可能だと思われますか? やりたい事は今回と同じで、一つは起動ドライブ上にあるEXEファイルをパラメータ付きで実行、一つはWINNT系かWIN98系か判断して、起動ドライブ上にあるEXEファイルを実行するというものです。

vc-toku
質問者

補足

再びすみません。 スクリプトの方は試してないのですが、Win98では「%~d0」の変数が無いせいか動きませんでした。 代替手段みたいなの物を探してみます。 そんなことをやってるよりも、スクリプトで組んだほうが早いですか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

バッチコマンドで、CD-ROMドライブを調べるコマンドは、無かったように思います。 VBScriptを使えば、CD-ROMドライブを調べることができます。 VBScriptを使ってみてはどうでしょうか 以前、似たような質問でVBScriptでCD-ROMドライブを調べるコードを書いたので参考URLが参考になるかもしれません。

参考URL:
http://okwave.jp/kotaeru.php3?qid=1243119
vc-toku
質問者

補足

参考URLを拝見しました。 せっかくご紹介していただいたのに、私はスクリプトのあまり理解ができません。 現在バッチファイルは次のようになっていますが、参考までにそのような形になるか教えて下さいませんか? @echo off if "%comspec%"=="" GOTO unknown_os if "%comspec%"=="c:\command.com" GOTO win_9x if "%comspec%"=="%systemroot%\system32\cmd.exe" GOTO win_NT goto end :win_NT \PRESEN\AdobeReader\win2kXp\AdbeRdr707_ja_JP.exe goto end :win_9X \PRESEN\AdobeReader\Win98SE\AdbeRdr60_jpn_full.exe goto end :unknown_os :end exit

関連するQ&A