Hey, Scripting Guy!

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

Hey, Scripting Guy! アーカイブも忘れずにチェックしてください。

今日の質問 : Windows XP でスクリプトを使用して CD に書き込むファイルを自動的にキューに入れる方法はありますか


スクリプトを使用して CD に書き込むファイルを自動的にキューに入れる方法はありますか

Q

Scripting Guy さん、よろしくお願いします。Windows XP でスクリプトを使用して CD に書き込むファイルを自動的にキューに入れる方法はありますか。

-- BD

A

BD さん、こんにちは。残念ながら、少し悪いお知らせがあります。現在のところ、スクリプトを使用して CD を書き込む方法はありません。問題なのは、おや、ちょっとお待ちください。必要なのは CD に書き込むファイルをキューに入れるだけなんですね。そういうことなら、話はまったく変わります。それに、私たち Scripting Guys も心底ほっとします。1 日おきにスクリプトを使用して CD に書き込む方法を尋ねられ、いつも「できません」と同じ回答をしているのですから。そのため、このコラムの冒頭でスクリプトを使用して CD を書き込むことはできませんと言ってしまったのです。これまでたくさんの人にスクリプトを使用して CD に書き込むことはできませんと回答しなければならなかったので、反射的に反応してしまいました。でも、単にすべてのファイルを収集し、CD に書き込む準備をするだけなのですね。もちろん、その方法はあります。

: それに、スクリプトを使用して CD に書き込みを行いたい人にとっては確実に良いお知らせがあります。 Windows Vista でその機能が実装されるのです。事実、Windows Vista ではスクリプトを使用して CD だけでなく DVD も書き込むことができるようになります。このことは今すぐには役に立たないかもしれませんが、この機能を待ち望んでいた人にとっては朗報ではありませんか。もう少し待つ必要がありますが、必要な CD および DVD をすべて書き込むことができるようになるのです。

CD に書き込むファイルをキューに入れるのは、次の短いスクリプトでうまくいきます。

Const HKEY_CURRENT_USER = &H80000001 
 
strComputer = "." 
 
Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 
  
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" 
strValueName = "CD Burning" 
 
objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValueName,strBurnFolder 
 
strFolder = "C:\Test" 
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
 
Set colFileList = objWMIService.ExecQuery _ 
    ("ASSOCIATORS OF {Win32_Directory.Name='" & strFolder & "'} Where " _ 
        & "ResultClass = CIM_DataFile") 
 
For Each objFile In colFileList 
    strCopy = strBurnFolder & "\" & objFile.FileName & "." & objFile.Extension 
    objFile.Copy(strCopy) 
Next

本当のところ、書き込むためのファイルをキューに入れることについては特に秘訣はありません。必要なのは、それらのファイルを CD Burning フォルダ (通常、このパスは C:\Documents and Settings\kenmyer\Local Settings\Application Data\Microsoft\CD Burning など) にコピーするだけです。CD Burning フォルダ (レジストリを読み取ると特定できます) の場所を特定したら、後はこのフォルダにファイルをコピーするだけです。

そのことを考慮して、最初の CD Burning フォルダの場所の特定から始めましょう。ローカル コンピュータだけでなくリモート コンピュータ上でもファイルをキューに入れることのできるスクリプトを作成するため、WMI を使用してフォルダの場所を特定することにします。そのために、まず、HKEY_CURRENT_USER という定数を定義し、値を &H80000001 に設定します。これにより、操作するレジストリ ハイブをスクリプトに指示します。まず、ローカル コンピュータで WMI サービスにバインドを行い (これまでと同様に、リモート マシンに対してこのスクリプトを実行するのも同じくらい簡単です)、システム レジストリ プロバイダに接続します。次のコードで、この処理を行っています。

Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

次に変数のペアに値を代入する必要があります。変数 strKeyPath には値 Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders が代入されます。これが読み取る必要のあるレジストリ値へのパス (HKEY_CURRENT_USER 内) です。一方で、変数 strValueName には値 CD Burning が代入されます。えー、これが、そうです。読み取るレジストリ値の名前です。

ここで Scripting Guy のスクリプトに対する知識の深さを披露しようとしたのに、皆さんも私たちと同様詳細をご存知だということがわかりました。あぁ、なんてことだ。

間違いなく皆さんご存知のとおり、これから GetStringValue メソッドを使用してレジストリ値を読み取り、CD Burning フォルダへのパスを特定します。

objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValueName,strBurnFolder

GetStringValue は、スクリプトの最初に定義した定数、2 つの変数 (strKeyPath および strValueName)、および strBurnFolder という "出力" パラメータ、これら 4 つのパラメータを取ります。strBurnFolder は出力パラメータであるため、値は割り当てません。その代わりに、GetStringValue メソッドがこの変数に (レジストリから読み取った) CD Burning フォルダの場所を自動的に代入します。

でも、皆さんはもうご存じでしたよね。

CD Burning フォルダの場所がわかったら、次はそのフォルダにファイルをコピーします。わかりやすくするため、C:\Test フォルダにあるすべてのファイルをコピーする必要があるとしましょう。そのためには、まずパス C:\Test を strFolder という変数に代入します。次に、WMI サービスへの 2 番目の接続を作成します。今度は、root\cimv2 名前空間にバインドします。接続を作成後、次のクエリを使用して、C:\Test フォルダ内のすべてのファイルのコレクションを返すことができます。

Set colFileList = objWMIService.ExecQuery _ 
    ("ASSOCIATORS OF {Win32_Directory.Name='" & strFolder & "'} Where " _ 
        & "ResultClass = CIM_DataFile")

ここから少しだけ厄介になってきます。なぜですって。WMI を使用してファイルをコピーするには、コピーされるファイルの完全なパス名を指定する必要があるためです。たとえば、C:\Test\File1.txt というファイルをコピーするとします。このファイルをコピーできる唯一の方法は WMI に新しいファイルへの完全なパスを提供することです。たとえば、C:\Documents and Settings\kenmyer\Local Settings\Application Data\Microsoft\CD Burning\File1.txt です。前に述べたように、これは少し厄介ですが、簡単に解決できます。その方法は次のとおりです。

まず、For Each ループを設定し、C:\Test フォルダにあるすべてのファイルをループ処理します。ループ内では、まず次のコード行を使用して、コピーされるファイルのパスを作成します。

strCopy = strBurnFolder & "\" & objFile.FileName & "." & objFile.Extension

ここでの処理の内容はおわかりになるでしょう。まず、(変数 strBurnFolder によって表される) CD Burning フォルダの場所を取得し、フォルダ名の最後に \ を追加します。次に、FileName プロパティの値 (File1 など) を追加し、続けてドット (.) および Extension プロパティの値 (txt など) を追加します。すると、変数 strCopy の値は次のようになります。

C:\Documents and Settings\kenmyer\Local Settings\Application Data\Microsoft\CD Burning\File1.txt

奇遇にも、これがコピーされるファイルへのパスになります。

そのパスを取得できたら、Copy メソッドにその値を渡し、CD Burning フォルダにファイルをコピーできます。

objFile.Copy(strCopy)

そこから、ループに戻り、コレクション内の次のファイルでこの処理を繰り返します。コレクション全体をループ処理した後、C:\Test 内のすべてのファイルが CD Burning フォルダにコピーされます。これで、CD にそれらのファイルを書き込む準備が整いました。

または、Windows Vista がリリースされるまで待って、スクリプトを使用して CD にそれらのファイルを書き込みます。どちらにするかは、お任せします。もちろん、Windows Vista でスクリプトを使用して CD や DVD に書き込む方法は必ず教えます。お任せください。数年間皆さんに残念なお知らせ ("いいえ、残念ながら、スクリプトを使用して CD に書き込みを行うことはできません") ばかりを伝えてきただけに、より良い回答を提供できることが待ちきれません。これでやっと、皆さんから寄せられるどんな質問にも回答することができます。

何ですって。スクリプトを使用して DHCP サーバーを管理する方法ですか。やはり、どんな質問にも回答できるというわけにはいかないようです...。


関連情報

Hey, Scripting Guy! - アーカイブもチェックしてください。

ページのトップへページのトップへ