
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。Windows PowerShell で切断されたレコードセットを使用する方法はありますか。レコードセットは問題なく作成できますが、作成したレコードセットのフィールドや値を参照する方法がわかりません。
-- JVDL

JVDL さん、こんにちは。私たちは、あなたが知的で穏やかで冷静な方であることに感銘を受けました。今日は 2008 年冬季スクリプト競技大会の開幕日です。他の人が、各種目の指示書を読んだり、Competitors Pack をダウンロードしたりするのに躍起になっているときに、あなたは、このコラムで Windows PowerShell で切断されたレコードセットの使用方法に関する質問をされているのですから。既にお伝えしたように、このような非常事態における JVDL さんの優雅さに感動しました。あなたは、きっとスクリプト界のジェームス ボンドみたいな方ですよね。
とすると、ジェームス ボンドのように、何か極秘情報を見つけ出したのかもしれませんね。スクリプト競技大会の Windows PowerShell の種目の 1 つで、Scripting Guys は、切断されたレコードセットを使用しました。JVDL さん、それが、この質問をお送りになった理由ですか。Scripting Guys が、冬季スクリプト競技大会に参加している方に有利になる情報をうっかり洩らしてしまうことを期待して、表面上害のなさそうな質問を投げかけたのですか。それが、あなたの不埒な計画ですか。
もし、そうだとしたら、それはけっこう良い計画だと思います。というのも、今日のコラムでは、Windows PowerShell で切断されたレコードセットを使用する方法をご説明するつもりですから。
聞かれる前にお答えしますが、切断されたレコードセットを使用したスクリプト競技大会の種目がどれであるか、ということにはお答えできません。拷問にかけると脅しても無駄ですよ。とにかく教えませんから。
それに、私たちは Scripting Guy の Jean Ross が執筆している Sesame Script のコラム (英語) を読破しました。とにかく、この拷問に耐えたので、それ以外の拷問の脅しは効かないと思いますよ。
やっぱり 1 つだけお知らせしておきましょう。スクリプト競技大会のその種目に取り組む場合は、必ずしも切断されたレコードセットを使用する必要はありません。私たちが切断されたレコードセットを使用したのは、それが簡単であり、切断されたレコードセットを PowerShell で使用できるかどうかということに興味があったからです (Scripting Guys の公式な見解 : それが可能であることを確認しました)。
ところで、このことも極秘情報としていましたが、Scripting Guys が、スクリプト競技大会の種目の回答を記述する際には、最適なスクリプトを記述することは滅多にありません。このような場合は、2 つのことを目標として掲げています。説明しやすいということと、他の方法を使用した場合には使う機会がない技法を試せるということの 2 点です。信じ難いことかもしれませんが、日常生活においては、Windows PowerShell スクリプトで切断されたレコードセットを使用する必要が生じることは、ほとんどありません。ですから、スクリプト競技大会は、切断されたレコードセットを使用するいい口実となりました。
さらに重要なのは、スクリプト競技大会により JVDL さんの質問への回答を入手できたことでしょう。JVDL さんは、Windows PowerShell で切断されたレコードセットを使用する方法をお知りになりたいとのことですが、その方法は、次のとおりです。
$adDouble = 5
$adFldIsNullable = 32
$objRecordset = New-Object -com "ADOR.Recordset"
$objRecordset.Fields.Append("Score", $adDouble, $Null, $AdFldIsNullable)
$objRecordset.Open()
for ($i = 1; $i -le 10; $i++)
{
$objRecordset.AddNew()
$objRecordset.Fields.Item("Score") = $i
}
$objRecordset.Sort = "Score DESC"
$objRecordset.MoveFirst();
do
{
$objRecordset.Fields.Item("Score").Value
$objRecordset.MoveNext()
}
until ($objRecordset.EOF)
では、このスクリプトが機能するしくみをご説明しましょう。まず、$adDouble という名前の変数に値 5 を代入します。この変数は、切断されたレコードセットに数値型のフィールドを作成するのに使用します (つまり、倍精度浮動小数点データ型のフィールドです)。ご参考までにお知らせしておきますが、JVDL さんは、切断されたレコードセットを使用して大量のデータを取得し、そのデータを数値型のフィールドで並べ替える方法を必要としています。そのため、ここでは、レコードセットで数値型のフィールドを使用しています。もちろん、通常は、バリアント型のフィールドを作成する必要があるでしょう。そのような場合は、$adVarChar という名前の変数を定義して使ってください。
$adVarChar = 200
$adDouble 変数を定義したら、$adFldIsNullable という名前の別の変数を定義して、この変数に値 32 を代入します。この変数を使用すると、Null 値を含むフィールドを作成できます。つまり、データが入力されていないフィールドを作成できる、ということです。これは、このサンプル スクリプトには関係のないことですが、役に立つことがあると思うので、その使用方法をご紹介しました。
それに、友人どうしの間では秘密ごとはなしですよね。
ただし、スクリプト競技大会のどの種目で切断されたレコードセットを使用するのか、ということは例外です。ですが、それ以外は…。
2 つの変数を定義して値を設定したら、次は New-Object コマンドレットを使用して、ADOR.Recordset オブジェクトのインスタンスを作成します。
$objRecordset = New-Object -com "ADOR.Recordset"
ここでは、–com パラメーターを追加する必要があることに注意してください。これは、.NET Framework のクラスではなく COM オブジェクトを操作しているために必要なことです。
レコードセット オブジェクトを作成したら、次のようなコード行を使用して、レコードセットにフィールドを追加します。
$objRecordset.Fields.Append("Score", $adDouble, $Null, $AdFldIsNullable)
ご覧のとおり、ここでは、単に次の 4 つのパラメーターを指定して Append メソッドを呼び出しているだけです。
| • | Score: フィールドの名前です。 |
| • | $adDouble: フィールドのデータ型です。ここでは、$adDouble 変数を使用して、倍精度浮動小数点データ型を使用する必要があることを示しています。 |
| • | $Null: 3 というパラメーターは、このフィールドに格納できる最大文字数が 3 であることを示します。これは数値型のフィールドには関係のないことですが、PowerShell では、ここになんらかの情報を指定する必要があります。ですから、ここでは Null 値 ($Null) を使用しました。この値を使用すると、スクリプトでは、このパラーメーターに関して何の処理も行われません。 |
| • | $adFldIsNullable: 既にお知らせしましたが、このスクリプトでは、このパラメーターは必要ありません。ですが、このパラメーターを使用すると、Score フィールドにはデータを格納しなくても良いということを示せます。これは、より多くのフィールドを含むレコードセットで有益なパラメーターです。たとえば、ユーザーの携帯電話の番号を入力するフィールドがある個人情報の一覧を所有しているとしましょう。そして、信じ難いことかもしれませんが、携帯電話を持っていない従業員のために、このフィールドで Null 値を許容する必要がある場合には役立ちます。 |
実話 : バルセロナで開催された TechEd IT Forum に参加するには、緊急時の連絡先情報を提示する必要がありました。それだけでなく、この緊急時の連絡先には携帯電話の番号を指定する必要がありました。配偶者、母親、親友が携帯電話を持っていない場合は、残念ですが、TechEd IT Forum にはご参加いただけません。 |
このサンプル スクリプトでは、フィールドを 1 つしか追加しませんが、複数のフィールドを追加する必要がある場合は、必要なフィールドの数だけ Append メソッドを呼び出し、その都度、適切な情報を指定すれば、必要なフィールドを追加できます。すべてのフィールドを定義したら、Open メソッドを呼び出して、切断されたレコードセットを操作できるようにします。
$objRecordset.Open()
JVDL さんが問題に直面したのは、ここです。具体的には、実際にレコードセットを操作するという時点です (さらに具体的に言うと、レコードセットのフィールドを参照するという時点です)。切断されたレコードセットにデータを追加する方法をご紹介するため、まず、次のコード行を使用して、$i 変数の値が 1 から 10 までの間実行される for ループを設定しました。
for ($i = 1; $i -le 10; $i++)
このループでは、AddNew メソッドを呼び出してレコードセットに新しいレコードを追加します。
$objRecordset.AddNew()
では、次の行に移りましょう。
$objRecordset.Fields.Item("Score") = $i
これが Windows PowerShell で、切断されたレコードセットのフィールドを参照する方法です。VBScript であれば、同じ処理を行うのに、次のようなコードを記述します。
objRecordset("Score") = i
ただし、JVDL さんがご自身で発見したように、この方法は PowerShell では機能しません。Windows PowerShell では、$objRecordset.Fields.Item("Score") のようにオブジェクトの完全なパスを指定する必要があります。このように指定すれば、お望みの操作が実行できるようになります。そして、この場合、このように指定すると、新しいレコードの Score フィールドの値には for ループの $i 変数の値が設定されます。
for ループの処理が完了したら、次の 2 行のコードを使用して、レコードセットのデータを降順で並べ替えて、並べ替えたデータの 1 つ目のレコードに移動します。
$objRecordset.Sort = "Score DESC" $objRecordset.MoveFirst();
この処理は必須ではありません。ですが、レコードセットのデータを降順で並べ替えると、数値型のデータを本当に操作できることをお見せできると思ったので、そうしたまでです。
これも JVDL さんが最初にやろうとしていた処理です。
では、どうしたら切断されたレコードセットに格納されている数値型のデータを操作できることをお見せできるかというと、まず、レコードセットの終わりに達するまで実行される do ループを設定します。つまり、レコードセットの EOF (ファイルの終わり) プロパティの値が True になるまで実行されるように設定します。このループでは、レコードセットの 1 つ目のレコードの値をエコー バックします。ここでも、$objRecordset.Fields.Item("Score").Value のように完全パスを使用して Score フィールドを参照しています。この処理が完了したら、MoveNext メソッドを呼び出して、レコードセットの次のレコードに対して同じ処理を繰り返します。
この一連の処理に必要なコードは次のコード ブロックです。これ以上に複雑なコードは必要ありません。
do
{
$objRecordset.Fields.Item("Score").Value
$objRecordset.MoveNext()
}
until ($objRecordset.EOF)
そして、これが Windows PowerShell で切断されたレコードセットを使用する方法になります。
これでうまくいくでしょう。皆さんを長く引き止めるつもりはありません。何しろ、多くの皆さんはスクリプト競技大会の前半に予定されている種目に取り掛かりたくてうずうずしているに違いありませんから (皆さんは、Windows PowerShell で切断されたレコードセットを使用する方法を習得されたので、少なくとも 1 つの種目は簡単にクリアできるはずです)。VBScript、Windows PowerShell、および Perl の全階級の種目 1 と種目 2 の締め切りは 2 月 20 日の水曜日ですので、お忘れなく。それまでに終わらせる自信がない、ですって。問題ありません。その場合は、種目 3 と種目 4 に取り組んでみてください (これらの種目の締め切りは 2 月 22 日の金曜日ですから)。本当にお時間のない方は、種目 9 だけにご参加ください。この種目の締め切りは 3 月 3 日の月曜日ですから、時間はたっぷりあるはずです。確かに 1 つの種目にしか参加しないと、満点を取るのは難しいですね。ですが、1 つの種目に参加していただければ、2008 年のスクリプト競技大会でご用意しているさまざまなすばらしい賞品を獲得する権利が与えられます。それだけでなく、この権利は、その種目で好成績を収めなくても与えられます。とにかく何かを提出すれば、賞品を獲得する権利を得ることができます。
お礼には及びません。これは、私たちが、Advanced 階級の種目 2 で、切断されたレコードセットを使用したことをお知らせしなかったことの埋め合わせですから。
注 : しまった。うっかり秘密を漏らしてしまいましたね…。まあ仕方がありません。簡単に手に入れられるものは失いやすいのです。ですが、種目 2 では、切断されたレコードセットを使用しなくても良いということは覚えておいてください。それに、この種目で、レコードセットを使用するのが最善の選択肢であるとは思っていませんし。実際、この方法を使用したのは、単に Windows PowerShell で切断されたレコードセットを使用してみたかったからです。ですが、種目 2 で、他の方法を使用してデータを操作する方法がひらめかなった場合は、仕方がありません。どうぞ、切断されたレコードセットをご利用ください。 |