
スクリプト作成初心者のためのコラム、"Sesame Script" へようこそ。このコラムの目的は、システム管理自動化に使用する Windows スクリプトの基礎を紹介することです。皆様がスクリプトを読んで理解し、ニーズに合わせてスクリプトを変更するために必要な情報を提供いたします。スクリプト作成について何かよくわからない点がありましたら、ご連絡ください (英語のみ)。多くの方が同じ疑問を抱えているはずです。
過去の記事については、Sesame Script アーカイブを参照してください。
| どのようなデータ型ですか | |
| データ型とは何でしょう | |
| Variant とは何でしょう | |
| なぜデータ型が重要なのでしょうか | |
| データ型を強制する | |
| 次の場合はどうでしょうか | |
| データ型と SDK | |
| 次回もお待ちしています |
休暇のシーズンは終わってしまいました。皆さんにとって、自転車やベビー用のプレイ サークルなどのさまざまなおもちゃや、要領を得ない説明書しかついていない珍妙な機械を組み立てることは、この季節のお楽しみの 1 つではないでしょうか。年末の休暇を祝わなくても、"ボルト A をスロット C に差し込む。ボルト B を締める – ボルト B ですって。ボルト B はどこかしら。どこを締めるのかしら" という騒ぎに巻き込まれることがあるでしょう。
皆さんの多くが、スクリプトを記述したり、スクリプト センターで見つけたスクリプトを修正したりしようとして、これと同じような混乱とフラストレーションを感じていることは知っています。「WMI SDK」や 「VBScript ランゲージ リファレンス」を参照しても、最後には完全に混乱してしまいます。ですから、Sesame Script の今回のお話では、さまざまなメソッドを呼び出して多種多様なプロパティを使用する方法を理解できるようにするために、参考文献をやさしく説明することにしました。
でも、すぐに行き詰ってしまいました。まずデータ型について理解しなければ、SDK の解析について説明するのはほぼ不可能です。先にすべきことを先に行いましょう。データ型について理解している場合は (本当に理解できている場合に限ります)、この記事を飛ばして次の記事を読むことができます。次の記事は参考文献の読み方を実際に学習するものです。正直に判断してください。
データ型とは、つまり、データの型です。文字列はデータの型です。実を言うと、1 文字でもデータの型です。数字も同じです。オブジェクトであっても、データの型です。データ型には、string、char、integer、object などがあります。また、Variant と呼ばれる風変わりなデータ型もあります。
VBScript では、Variant という 1 つのデータ型を使います。Variant は、VBScript においてはデータ型は重要ではないということを意味しています。それでは、私たちにとってはなぜデータ型が重要なのでしょうか。この問題についてはすぐに説明します。ここでは、データ型が重要だということだけで十分です。少なくとも少しは重要です。
VBScript で変数を使用するときには、常に好きなように名前を付け、好きな値を割り当てます。変数の名前にハンガリー語の表記を使用するときでも、それに対応するデータを変数に割り当てる必要はありません。たとえば、この変数が str で始まっているからといって、文字列を割り当てる必要はありません。
strData = "a string of data"
この変数に数値を割り当てることもできます。
strData = 4
オブジェクトを割り当てることもできます。
Set strData = CreateObject("Scripting.FileSystemObject")
名前は自分だけが使用するものです。VBScript では、それに何を割り当てるかは重要ではないのです。
"なぜデータ型が重要なのか" という問題に戻りましょう。次のような操作を行うとします。
strData = "a string" intData = 4 DataTotal = strData + intData Wscript.Echo DataTotal
VBScript ではどのように処理するでしょうか。DataTotal には "a string4" のような文字列が含まれると思いますか。あるいは、何かの数字が含まれると思いますか。次の場合はどうでしょうか。
strData = "23" intData = 4 DataTotal = strData + intData Wscript.Echo DataTotal
DataTotal には "234" または 27 は含まれますか。または、両方とも含まれませんか。試してみて結果をご覧になってください。
試してみましたか。まだでしたら、試してください。急がなくても大丈夫です。
2 つのスクリプトを試してみると、最初のスクリプトではエラーが発生することがわかりました。
C:\Scripts\test.vbs(3, 1) Microsoft VBScript runtime error: Type mismatch: 'strData'
一方、2 番目のスクリプトでは、次のように値が返されます。
27
何が行われているのでしょうか。VBScript では、あなたが何を意図しているかを推測しようとしています。最初のスクリプトでは、文字列を数値に加えようとするときに私たちが何を意図していたかが VBScript では判断できなかったのです。VBScript はこのスクリプトから私たちの意図を推測できなかったので、あきらめてエラー メッセージを表示しました。2 番目のスクリプトでは、文字列が数値から構成されており、あなたがそれを加えようとしていると、VBScript は判断しました。そのため、VBScript では数値の前後の引用符が間違いであると判断し、 あなたの目的は文字列ではなく数値だと判断しました。その点を考えて、VBScript では文字列を数値として扱い、数値を合算してくれました。
こつを覚えるために、次のスクリプトにも挑戦してください。
strData1 = "23" strData2 = "4" DataTotal = strData1 + strData2 Wscript.Echo DataTotal
何が返されますか。もう、27 は返されません。234 が返されました。なぜでしょう。VBScript では両方の値に文字列が含まれていると判断し、これらの数字を文字列として処理し、2 つの値を連結しました。両方の値は明らかに文字列であるため、引用符を無視する必要はありませんでした。VBScript では 2 つの文字列を加えることは 2 つの文字列を連結することと同じだと判断されます。
さて、VBScript で正しい推測が行われることに信頼を置きたいかもしれませんが、それが常に正しいとは限りません。ときには、VBScript にデータ型を指示する場合があるかもしれません。単刀直入に、推量をしないように指示します。しかし、データ型を指定できないときには、どうすればよいでしょうか。まさにこの問題を解決するために作成された、VBScript の組み込み関数を使用します。
2 つの数値文字列を連結する、前述のスクリプトを見てみましょう。
strData1 = "23" strData2 = "4" DataTotal = strData1 + strData2 Wscript.Echo DataTotal
もし、これらの文字列を数値として処理するとしたら、どうすればよいでしょうか。そうです。小さな孤立したサンプルの世界では、数値の前後の二重引用符を削除できます。しかし、現実の世界でのシナリオを想像してみてください。値はテキスト ファイルから読み込まれました。VBScript で値を数値として扱うか文字列として扱うかはあなたにはわからず、これらの数値は会計部門に報告するため、推測での作業は問題の原因になりかねません。ですから、これらの値を明確に数値として処理するように VBScript に指示します。
strData1 = "23" strData2 = "4" DataTotal = CInt(strData1) + CInt(strData2) Wscript.Echo DataTotal
このスクリプトを実行すると、文字列が整数に変換され、DataTotal の値は 27 となることがわかります。VBScript には、文字列、日付、および他のデータ型の変換に使用する同様の関数があります。また、文字列に数値が含まれていなかった場合はどうなるでしょうか。ご覧ください。
strData1 = "string 1" strData2 = "string 2" DataTotal = CInt(strData1) + CInt(strData2) Wscript.Echo DataTotal
CInt はエラーを返します。文字列を整数に変えることはできないからです。
C:\Scripts\test.vbs(3, 1) Microsoft VBScript runtime error: Type mismatch: 'CInt'
日付と時刻、倍精度、null 値などの場合はどうでしょうか。ここでは、データ型の概念と VBScript での処理方法を紹介する、簡単な説明を行います。「Microsoft Windows 2000 Scripting Guide」にはデータ型に関する詳細な情報があり、日付と時刻の操作について詳しく説明しています。詳細については、「詳細情報」を参照してください。
詳細情報
Microsoft Windows 2000 Scripting Guide: (英語)
| • | VBScript Data Types (英語) |
| • | |
| • | Working with Strings (英語) |
| • | Working with Numbers (英語) |
VBScript の関数 - VBScript ランゲージ リファレンス
VBScript では Variant データ型を使用することや、必要に応じてさまざまな VBScript 関数を使用してこれらのデータ型を操作できることがわかりました。では、SDK とはどのように関連しているのでしょう。先走りして次のコラムの楽しみを損ねてしまいたくはありませんが、WMI SDK について少し説明しましょう。
class Win32_LocalTime : Win32_CurrentTime
{
uint32 Day;
uint32 DayOfWeek;
uint32 Hour;
uint32 Milliseconds;
uint32 Minute;
uint32 Month;
uint32 Quarter;
uint32 Second;
uint32 WeekInMonth;
uint32 Year;
};
これが WMI の Win32_LocalTime クラスの定義です (クラスとは何かがわからない場合は、「クラスはセッション中」を参照してください)。中かっこ { } 内にリストされた各項目はそのクラスのプロパティです。Win32_LocalTime は非常に簡単なクラスであり、すべてのプロパティは uint32 として定義されます。uint32 データ型は 32 ビットの整数、つまり人間にとっては一般的な数値です。このため、Win32_LocalTime クラスの Day プロパティを読み取った場合は、数値が返されることがわかります。
SDK でこのようなことが示される理由の 1 つとして、既に述べたように、どのようなデータが返されるかを知り、そのデータを取得してどのように処理するかを知ることが重要となる場合があるということがあります。また、プロパティの値を設定する場合は、どのような種類の値を設定する必要があるかを知る必要があります。これは妥当な考え方ですが、uint32 を使用する本当の理由ではありません。もしそれだけならば、ドキュメントを次のようにしたほうが簡単ではないでしょうか。
Class: Win32_LocalTime
Properties:
integer Day
integer DayofWeek
integer Hour
…
それでは、なぜ uint32 や中かっこなどが必要なのでしょう。それは VBScript では WMI を排他的に使用しないからです。C++ や C# などの多くのプログラミング言語では、変数の種類を指定してから使用する必要があります。これを "強い型付け" といいます (反対に、VBScript は "弱い型付け" です)。強い型付けの言語では、次のようなことはできません。
strHello = "Hello"
VBScript ではこの 1 行で正常に実行できます。しかし、C# では次のようにする必要があります。
string strHello; strHello = "Hello";
もちろん、これを次のように 1 行にすることもできます。
string strHello = "Hello";
重要なことは、その変数を文字列として使用するということを C# に対して指示する必要があるということです。指示するだけではなく、実際にその変数を文字列として使用する必要があります。次の場合はエラーが発生します。
string strHello = 4;
WMI SDK はだれでも使用できるように記述されており、強い型付けの言語の場合はデータ型とは何か、uint32 (これは符号のない 32 ビットの整数を意味します) と uint64 (何を意味するかわかりますね) とは何かを理解している必要があるのです。
次回のコラムでは、言語リファレンスとソフトウェア開発キットについて詳しく説明します。すぐにボルト A がスロット C にぴったりとはまるようになります。おそらく、ですが。