
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。テストのために、フォルダ内に大量の空の .WAV ファイルを作成する必要があります。このようなファイルを自動的に作成するスクリプトを記述する方法はありますか。
-- ZL

ZL さん、こんにちは。昨日は、このコラムを執筆している Scripting Guy にとって非常に楽しい 1 日でした。Scripting Guy の Jean Ross が定期的にやっているのと同じように、彼は自宅で仕事をすることになったのです (そうですね。Jean が本当に自宅で仕事をしているかどうかはわかりませんが、彼女は仕事をしていると言っています)。Scripting Guys は TechEd IT Forum の Ask the Expert セクションのあるブースを受け持つので (22 番ブースです。立ち寄って、『Dr. Scripto’s Fun Book』(英語) をお持ち帰りください。Dr. Scripto ボブルヘッド人形が手に入るかもしれません)、イベントの主催者が必要に応じて連絡を取れるように携帯電話を持つことが提案されていました。
注 : イベントの主催者は、午前 2 時にカンファレンスの参加者の 1 人が、リモート コンピュータで実行しているプロセスの一覧を取得するスクリプトがどうしても必要になるような事態が発生するとでも思っているのでしょうか。それとも、ある夜更けに別の参加者が、Scripting Guy の息子が所属する野球チームでプレーしているポジションが思い出せなくなるとでも思っているのでしょうか (ちなみに、ポジションはピッチャーと一塁手です)。私たちにはわかりません。でも、機会があっても無駄ですよね。とにかく、Scripting Guys は 24 時間年中無休ですぐ対応いたします。 |
いずれにせよ、Scripting Guys は 2 人ともヨーロッパで使える携帯電話を持っていません (これで普段 Scripting Guys がどの程度外国に行くことができるのか、おわかりですね)。つまり、Scripting Guys は携帯電話をレンタルする必要があり、この携帯電話はこのコラムを執筆している Scripting Guy の自宅に配達されることになりました。ですから、だれかが家にいて、携帯電話が届いたときにサインする必要があるというわけです。
では、自宅作業の状況をお知らせしましょう。まず、いつもよりも少し遅く起きて、朝食を食べて新聞を読み切りました。ネットワークにログオンし、その間中あらゆる処理が遅いことについて文句を言いました。電子メールを読んでから、昼食休憩をとりました。食事中に雑誌を読んでいたので、昼食を食べ終わったら雑誌を最後まで読みました。昼食の後は気分が落ち着かなかったので、早めに仕事を切り上げてジムに行き、たっぷり 40 分間エアロバイクをこぎました。Scripting Guy の息子と同じくらいの時刻に帰宅し、2 人で ESPN を見てからハスキーズのバスケットボールの試合に出掛ける準備をしました。
今考えてみると、少なくとも私たちにとっては、自宅で仕事することは職場で仕事することとあまり変わらないようです。
ちょっと待ってください。昼間は見たいテレビ番組がなかったので、このコラムを執筆している Scripting Guy は自宅で仕事をしている間にもう 1 つの作業をすることができました (皿洗い機を使ったことを入れれば 2 つですが)。つまり、フォルダ内に大量の空の .WAV ファイルを作成するスクリプトを記述することもできました。
Set objFSO = CreateObject("Scripting.FileSystemObject")
For i = 1 to 100
strFileName = objFSO.GetTempName
strFileName = Replace(strFileName, ".tmp", ".wav")
strPath = "C:\Temp\" & strFileName
objFSO.CreateTextFile(strPath)
Next
考えてみれば、彼は 3 つの作業をしました。スクリプトのしくみについての説明も執筆しました (ひどく疲れているのも無理はありません。明日は休んだ方がよいかもしれませんね)。手始めに・・・。手始め (キック オフ) といえば、ワシントン大学がスタンフォード カーディナルを破って、ついにフットボールの試合で 1 勝を収めたことはお知らせしたでしょうか。頑張れ、ハスキーズ。
とにかく、まず、Scripting.FileSystemObject のインスタンスを作成します。FileSystemObject をどう処理するのか、というご質問ですか。すぐにわかりますよ。
そうです、本当に "すぐ" です。信用してください。
デモンストレーションを行うために、C:\Temp フォルダに 100 個の空の .WAV ファイルを作成することにしました。これを念頭に置いて、次は、カウンタ変数の値が 1 から 100 までの間実行される For Next ループを設定します。この処理を行うのが次のコード行です。
For i = 1 to 100
新しいファイルを作成する段階に到達したら、そのファイルの完全パスをファイル名を含めて指定する必要があります。ファイル パスを作成する処理の最初の手順は、GetTempName メソッドを使用してファイル名として使用するランダムな名前を作成することです。
strFileName = objFSO.GetTempName
GetTempName メソッドの目的はただ 1 つ、ランダムなファイル名を生成することです (GetTempName メソッドの名前に含まれる Temp という単語は、このようなランダムな名前がしばしば一時ファイルに付けられることに由来しています)。
最終的には、GetTempName メソッドによって次のようなファイル名が 100 個作成されます。
rad0F25C.tmp rad2A9FD.tmp radEA60F.tmp
何ですって。うーん、言われてみれば、これらのファイルのファイル拡張子はすべて .TMP ですね。私たちが必要なのは .WAV ファイル拡張子を持つ多数のファイルですから、これは問題です。
さいわい、For Next ループに次のコード行を含めてあります。
strFileName = Replace(strFileName, ".tmp", ".wav")
ここでは、VBScript の Replace 関数を使用して、.tmp という文字列値 (これはちょうど、GetTempName メソッドによって作成された各ファイルのファイル拡張子に見事に一致しています) のすべてのインスタンスを .wav という文字列値に置換しています。この処理により、ファイルは次のような名前になります。
rad0F25C.wav rad2A9FD.wav radEA60F.wav
有効なファイル名を作成したら、次に以下のコード行を使用して完全なファイル パスを構成します。
strPath = "C:\Temp\" & strFileName
ここでも、それほど変わったことはしていません。これらの空の .WAV ファイルは、すべて C:\Temp フォルダに作成する必要があります。そのため、新しいファイルのパスを構成するために、C:\Temp\ を GetTempName メソッドで生成した最初のファイル名と結合します。その結果、次のような値が strPath 変数に代入されます。
C:\Temp\rad0F25C.wav
これが有効なパスらしくないと言うのなら、有効なパスらしいとはどういうことなのかわかりません。
後は、(strPath 変数を渡して) CreateTextFile メソッドを呼び出すだけで、1 つ目の空の .WAV ファイルを作成できます。
objFSO.CreateTextFile(strPath)
さて、あなたの考えはわかっていますよ。.WAV ファイルが必要なのに、テキスト ファイルを作成する CreateTextFile メソッドを呼び出しましたが、何があったのかを知りたいと思っていますね。
実は、ここでは、有効な .WAV ファイルを作成しようとはしていません。つまり、Windows Media Player で再生できる実際のサウンド ファイルを作成しようとはしていません。代わりに、空の .WAV ファイルを作成します。このファイルは .WAV ファイル拡張子があるという点においてのみ、サウンド ファイルです。CreateTextFile メソッドを使用して .WAV ファイルを作成できるのは、このメソッドでは使用するファイル拡張子が問題にならないためです。というのも、実際のテキスト ファイルが必ずしも .TXT ファイル拡張子を持っているとは限らないからです (.CSV ファイル、.XML ファイル、.HTM ファイルなどの場合があります)。スクリプトのテストを行うのに特定の種類のファイルが必要な場合 (たとえば、フォルダ内の .DOC ファイルだけを削除するスクリプトを作成しようとしている場合) は、必要なファイル拡張子を含むファイル名を CreateTextFile メソッドに渡せば、後は CreateTextFile メソッドにお任せです。
ZL さんのお役に立てばと思います。それに、TechEd IT Forum の参加者が、全員 Ask the Experts セクション (22 番ブース) に立ち寄って声を掛けていただければと思います (そうですね、少なくともブースに立ち寄って、『Dr. Scripto’s Fun Book』(英語) をお持ち帰りになり、Dr. Scripto ボブルヘッド人形を手に入れられるかどうか運試しをしてみてください)。あと、IT Forum の間に何かが必要になった場合は、昼夜を問わずいつでも Scripting Guy の Jean Ross にお電話ください。喜んでお手伝いいたします。