Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

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

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

テキスト ファイルの最初の 5 文字をコンピュータ名の最初の 5 文字で置き換える方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。テキスト ファイルを開き、最初の 5 文字をローカル コンピュータ名の最初の 5 文字で置き換える方法はありますか。

-- EC

SpacerHey, Scripting Guy! AnswerScript Center

EC さん、こんにちは。信じがたいことかもしれませんが (同僚の Scripting Guy は端から信じるつもりはないと言い切っています)、このコラムを執筆している Scripting Guy は、口先ばかりで、行動が伴わないことがあります。たとえば、数か月前、彼は大学に戻り、(この学位をたったの 2 週間で取れると公約している電子メールを利用して) 2 つ目の修士号を取るつもりだとみんなに話していました。しかし、彼は本当に大学に戻るつもりがあったのでしょうか。実のところ、そんなつもりはありませんでした。再び懸命に勉強して何かを学びたいと思う気持ちは、はるか彼方に置いてきてしまいましたから。

と思いきや、昨晩、彼の人生は一変しました。

これはさらに信じがたいことかもしれませんが、このコラムを執筆している Scripting Guy は、昔、かなり頭がよかった時期がありました。実際、SAT テストを受験した結果、国中の大学から入学を求める声が殺到しました。ハーバード、エール、スタンフォードなど、よりどりみどりです。最終的には、費用の問題もありましたが、おおむねはものぐさな性格のために、ワシントン州にとどまることを選びました。ハーバードやエールには申し訳ありませんが、正直なところ、そんな場所はとても楽しそうだとは思えなかったのです。このコラムを執筆している Scripting Guy に限っては、どうでもよいことでした。大学なんてどこも同じです。

と思いきや、昨晩、Scripting Guy の息子はテレビのチャンネル サーフィンをしていましたが、最終的に Food Network に落ち着きました。そのチャンネルを見て、このコラムを執筆している Scripting Guy は、自分の人生で何をすべきかについて、ついに悟ったのです。それは、ダンキンドーナツ大学を卒業することです。そう、1966 年に設立されたダンキンドーナツ大学は、ドーナツを作ること (と食べること) に特化したカリキュラムを提供する学校です。高慢なアイビーリーグの大学では、ドーナツを作ったり、食べたりできるコースなんてないでしょう。

うーん、ひょっとしたら、プリンストンでは見つかるかもしれませんが、それ以外の大学では、ないでしょうね。

ただし、1 つ問題があります。このコラムを執筆している Scripting Guy には、さまざまな大学から入学の誘いが殺到しましたが、ダンキンドーナツ大学からは誘いがなかったのです。これは、ダンキンドーナツ大学に入学するには適格でないということでしょうか。これまでの人生で食べてきたドーナツの数を考えると、ひょっとしたら、適格なレベルを超えてしまっているのかもしれません。しかし、ダンキンドーナツでは、切れ者で、よく働き、責任感のある人材を求めていると思います。

あ、なんにでも何かしら問題点はあるものですね。

でも、ダンキンドーナツ大学の入学審査委員会のみなさん、切れ者で、よく働き、責任感があって、テキスト ファイルの最初の 5 文字をローカル コンピュータの名前に置き換えるスクリプトを作成できる男性についてどう思いますか。

では、これと同じものですが、頭が悪くて、怠け者で、ちょっと責任感のない男性が作成した次のスクリプトについてはどうですか。

Const ForReading = 1
Const ForWriting = 2

Set objFSo = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)

strContents = objFile.ReadAll
objFile.Close

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strComputer = Left(strComputer, 5)

intlength = Len(strContents)
strRemainder = Right(strContents, intLength - 5)
strNewContents = strComputer & strRemainder

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForWriting)
objFile.WriteLine strNewContents

objFile.Close

このコラムの執筆者である Scripting Guy がこのスクリプトをインターネットからダウンロードしただけ (修士論文でも同じことをしていますが) だなんて、ダンキンドーナツ大学の入学審査委員会はまず考えないでしょうが、とにかくこれがどのように機能するかをちょっと説明しましょう。まず、C:\Scripts\Test.txt という名前のテキスト ファイルがあります。これは、ここでサンプルとして使用する、次のような内容のテキスト ファイルです。

XXXXX This is our text file. We want to replace the first five
characters (the Xs) with the first five characters of the
local computer's name.

ご覧のように、このテキスト ファイルの最初の 5 文字は、X のみです。ここでは、この 5 文字をローカル コンピュータ名の最初の 5 文字に置き換えます。

そのためには、まず ForReading と ForWriting という名前の 2 つの定数を定義します。この 2 つの定数は、Test.txt を開くときに使用する必要があります (そうです。よかれあしかれ、このテキスト ファイルは 2 回開く必要があります。既存の内容を読み取るときに 1 回と、その内容を新しい変更された内容に置き換えるときの 2 回です)。2 つの定数を定義できたら、次の 2 行のコードを使用して Scripting.FileSystemObject のインスタンスを作成し、テキスト ファイルを読み取り用に開きます。

Set objFSo = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)

ファイルを開いたら、ReadAll メソッドを使用してファイルの内容を読み取り (この情報を strContents という名前の変数に格納し)、Test.txt を閉じます。

strContents = objFile.ReadAll
objFile.Close

次はなんでしょうか、ですって。

そんなことを聞くなんておもしろい方ですね (私たちがお客様の問い合わせにすばやく対応することに、入学審査委員会が気づいてくれるとよいのですが)。次は、以下のコード ブロックを実行します。

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName

ここでは、Wscript.Network オブジェクトのインスタンスを作成し、ComputerName プロパティの値を strComputer という名前の変数に代入しています。おそらく、ComputerName プロパティの値が偶然にもコンピュータ自体の名前であったとしても、それほど驚くことはないでしょう。もちろん、完全なコンピュータ名が必要なわけではありません。必要なのは、最初の 5 文字だけです。これを踏まえて、Left 関数を使用して最初の 5 文字を取得し、これを strComputer 変数に格納します。

strComputer = Left(strComputer, 5)

最終的に、たとえば (実際にこの名前なのですが) GIZMONIC という名前のコンピュータでこのスクリプトを実行したとすると、strComputer 変数の値は次のようになります。

GIZMO

これで、コンピュータ名の最初の 5 文字を取得できました。次の作業は、テキスト ファイルの最初の 5 文字をこのコンピュータ名の文字で置き換えることです。テキスト ファイルに含まれている情報の種類によっては、検索と置換の操作を使用して、ファイル内の最初の 5 文字を置換できる可能性があります。ただし、この方法が使えるのは、テキスト ファイル内の最初の 5 文字が常に XXXXX であり、その他にも XXXXX という文字列がある場合にこれが GIZMO に置き換えられてもよい場合に限ります。このような条件が常に当てはまるとは限らないため、次の方法で最初の 5 文字を置き換えることにしました。

intlength = Len(strContents)
strRemainder = Right(strContents, intLength - 5)
strNewContents = strComputer & strRemainder

このコード ブロックの最初の行では Len メソッドを使用して、strContents 変数に格納されている文字数を数えています。この例では正確には 149 文字です。ご存じのように、置き換えるのはこの文字列の最初の 5 文字のみで、6 文字目から149 文字目までは現在の内容を維持する必要があります。この処理を行うのが、2 行目のコードです。この行では、Right 関数を使用して、文字列の最後から順番に文字を取得しています。取得する必要がある文字は、何文字でしょうか。文字列全体の長さから 5 を引いた数の文字が必要です (149 – 5 = 144 です。つまり、文字列の最後から順に、右から左へと進んで、最初の 144 文字を取得します)。次に、strRemainder 変数に、文字列の最初の 5 文字を除いたすべての文字が代入されます (これは最初の 5 文字に到達する直前で、文字列の取得が終了するためです)。

また、別の言い方をすると、strRemainder 変数の値は次のようになります。

This is our text file. We want to replace the first five
characters (the Xs) with the first five characters of the
local computer's name.

ご覧のとおり、これは最初の 5 文字を除いた全文字列です。

最後の 3 行目で、strComputer 変数と strRemainder 変数の値を結合し、その値を strNewContents という名前の変数に代入しています。これで、この新しい変数の値は次のようになります。

GIZMO This is our text file. We want to replace the first five
characters (the Xs) with the first five characters of the
local computer's name.

いやあ、これは驚きました。テキスト ファイルの最初の 5 文字 (XXXXX) がコンピュータ名の最初の 5 文字 (GIZMO) に置き換わりました。

最後は、Test.txt を開き (今回は書き込みをするため)、WriteLine メソッドを使用して、古い内容を新しい変更された内容で上書きして、ファイルを閉じます。

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForWriting)
objFile.WriteLine strNewContents

objFile.Close

これでうまくいくでしょう。

EC さんのお役に立てばと思います (また、ダンキンドーナツ大学の入学審査委員会の方に、好印象を持っていただければさいわいです)。もう少し時間をとってみなさんからの質問をお受けしたいのですが、急いで近くのベーカリーに行って、いくつかドーナツを仕入れて来なければなりません。やはり、入学試験に向けた勉強を始めるのは早いに越したことはないですから。

少なくとも、ダンキンドーナツ大学に入学したいと思っているのでなければの話ですけどね。


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