Hey, Scripting Guy!

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

Hey, Scripting Guy!

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

詳細情報

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

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

Hey, Scripting Guy! ダウンロード (英語)

Spacer

*

Windows PowerShell を使用して Microsoft Access データベースからレコードを取得する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Windows PowerShell を使用して Microsoft Access データベースからレコードを取得する方法はありますか。

-- SB

SpacerHey, Scripting Guy! AnswerScript Center

SB さん、こんにちは。この質問の回答を得られるあなたは幸運です。というのも、これが最後の "Hey, Scripting Guy!" コラムになりそうだからです。

実を言うと、このことは私たちにも少し驚きでした。これほど早くに引退する予定はありませんでした (上司は毎日のように Scripting Guys に対して引退を勧めていますが)。しかしそれも、今朝、スペイン宝くじ当選者国際電子メール プログラムで 100 万ユーロの賞金が当たったことを知らせる電子メールを受け取るまでのことです。ここでの仕事を気に入ってはいますが、億万長者が、7 時から仕事を始めるために毎日 6 時に起きるのは不自然な気がします。

: 宝くじを申し込まなくても当たることが、幸運なことだと思っていませんか。たいしたことはありません。というのも、このコラムを書いている Scripting Guy がスペインの宝くじ (または、電子メールから引用すると "スベインの" 宝くじ) に当たったのは、これが今年で 4 回目か 5 回目です。驚くことに、この宝くじは 3 年に 1 度しか行われないにもかかわらず、彼はこれを成し遂げています。幸運とは、まさにこのことです。

実を言うと、今日のコラムさえも書かないつもりでした。晩餐会用のキャビアを買う場所やフォークの本数について悩んでいるときに、スクリプトに集中するのは困難です。その一方で、電子メールには、"一部の数字と名前に混乱" があり、すべてを整理するのに少し時間がかかることが記されていました。その結果、少し暇な時間ができてしまいました。その点を考慮し、Windows PowerShell を使用して Microsoft Access データベースからレコードを取得する方法について説明します。昔のよしみで、最後の "Hey, Scripting Guy!" コラムをお届けします。

では、スクリプトを見ながら、その方法がわかるかどうか見てみましょう。

$adOpenStatic = 3 
$adLockOptimistic = 3 
 
$objConnection = New-Object -comobject ADODB.Connection 
$objRecordset = New-Object -comobject ADODB.Recordset 
 
$objConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = c:\scripts\sample.mdb") 
$objRecordset.Open("Select * from TotalSales", $objConnection,$adOpenStatic,$adLockOptimistic) 
 
$objRecordset.MoveFirst() 
 
do {$objRecordset.Fields.Item("EmployeeName").Value; $objRecordset.MoveNext()} until  
    ($objRecordset.EOF -eq $True) 
 
$objRecordset.Close() 
$objConnection.Close()

ご覧のとおり、値 3 を 2 つの異なる変数に割り当てるという、簡単なところから始めます。変数は、$adOpenStatic および $adLockOptimistic です (Windows PowerShell に不慣れで、これらの変数名について疑問がある場合のために述べると、すべての変数名が $ で始まるのには理由があり、変数名はこのように始まる必要があります)。ここでは、ADODB (ActiveX Database Objects) スクリプトについては具体的に説明しません。詳細については、以前の Scripting Guys Web キャスト (英語) を参照してください。その代わりに 1 つ説明すると、これらの 2 つの変数は、最後にデータベースからデータを取得するときに使用します。

値を 2 つの変数に割り当てた後、New-Object Cmdlet を使用して 1 組のオブジェクト参照を作成します。1 つは ADODB.Connection オブジェクト、もう 1 つは ADODB.Recordset オブジェクト用です。

$objConnection = New-Object -comobject ADODB.Connection 
$objRecordset = New-Object -comobject ADODB.Recordset

ご覧のとおり、New-Object は、VBScript の CreateObject メソッドと同じ働きをします。ちなみに、VBScript で Connection オブジェクトの作成に相当するコードは、次のとおりです。

Set objConnection = CreateObject("ADODB.Connection")

構文の違いは明らかですが、明確な類似点もあります。

2 つのオブジェクトを取得したら、データベース (C:\Scripts\Sample.mdb) に接続し、そのデータベースのテーブルにクエリします。サンプル スクリプトでは、次のコード行を使用して、TotalSales という名前のテーブルからすべてのレコードを選択しています。

$objRecordset.Open("Select * from TotalSales", $objConnection,$adOpenStatic,$adLockOptimistic)

そうです。これは、VBScript を使用してレコードセットを開く操作とほぼ同じです。(変数名以外で) 唯一異なるのは、VBScript では Open メソッドに渡されるパラメータにかっこを付けないことです。

objRecordSet.Open "Select * From TotalSales", _ 
    objConnection, adOpenStatic, adLockOptimistic

ですが、これは VBScript でのことです。Windows PowerShell では、メソッドを呼び出すとき、パラメータを必要としない場合であっても、常にかっこを使用する必要があります。たとえば、クエリ情報を含めずに Open メソッドを呼び出すとします。その場合、コードは次のようになり、メソッドに空のかっこのセットが続きます。

$objRecordset.Open()

レコードセットを開いたら、MoveFirst メソッドを呼び出して (既に述べたとおり空のかっこに注意します)、カーソルをレコードセットの先頭に配置します。では、次のブロックに移りましょう。

do {$objRecordset.Fields.Item("EmployeeName").Value; $objRecordset.MoveNext()} until  
    ($objRecordset.EOF -eq $True)

ここでは、レコードセットの終わりに達するまでループする Do Until ループを作成しています。この機能について説明すると、最初にキーワード "do"、続けて、実行する操作を記述します。操作は、中かっこ内に含める必要があります。ループ内では、2 つのことを行います。まず、次に示すコード部分により、EmployeeName フィールドの値をエコー バックします。

$objRecordset.Fields.Item("EmployeeName").Value

そうです。VBScript とは異なり、フィールド名の後に ".Value" を付ける必要があります。Value はレコードセットのアイテムを扱うときの既定のプロパティです。明示的にプロパティ名を指定しない場合、VBScript では自動的に既定のプロパティが使用されます。しかし、それは Windows PowerShell には当てはまりません。既定のプロパティかどうかにかかわらず、".Value" を追加する必要があります。

レコードセット内の先頭レコードの EmployeeName の値を表示した後は、次のレコードに移動します。そのため、次のコード部分を使用して MoveNext メソッドを呼び出します。

$objRecordset.MoveNext()

従業員名をエコー バックするためのコマンドと、次のレコードに移動するためのコマンドが、共に中かっこ内に含まれていることに注目します。また、この 2 つはセミコロンで区切られています。言うまでもなく、Windows PowerShell では、セミコロンはコマンドを区切るための方法の 1 つです。

"do" 部分については以上ですが、"until" 部分についてはどうでしょうか。"until" キーワードを入力した後、次のコードを (かっこで囲んで) 使用して、レコードセットの EOF (ファイルの終わり) プロパティが true になるまでスクリプトを続けるように指定します。

$objRecordset.EOF -eq $True

ここで注意すべき点が 2 つあります。まず、等号ではなく -eq 比較演算子を使用します。これは、また別の Windows PowerShell の規則であり、慣れる必要があります。次に、値 True の前の $ に注目します。ブール値を $True または $False と入力する必要があるでしょうか。$ を付けるものとお考えください。

これで作業は完了です。スクリプトはレコードセットをループし、Total Sales テーブルにある各従業員名を表示します。EOF プロパティが true になったら (つまりレコードセットの終わりに達したら)、Do ループを終了し、次の 2 行のコードを使用して、レコードセットとデータベース接続を閉じます。

$objRecordset.Close() 
$objConnection.Close()

これで終了です。

終了ということは、つまりこれが最後のコラムということです。ただし、だれかが Scripting Guys を騙そうとしていることや、スペインの宝くじに実は当たっていないことがわかれば話は別ですが。ところで、その確率はどのくらいでしょうか。このようなまったく品のない目的のためにインターネットを使用するなど、私たちにはとても想像できません。


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