PowerShell を使って Access のデータベースにアクセスするには、実行環境や接続文字列に注意点があります。この点の詳しい内容は以下の記事を参照してください。
では、Access データベースに、既存の技術である ADO を用いてテーブルのデータを読み込むサンプルを提示します。
詳細はコメントを付けてあるので分かると思いますが、スクリプトと同じディレクトリにある Access のデータベースファイル (test.mdb or test.accdb) にアクセスし、以下のテーブルを読み込み内容を画面に出力します。
- テーブル名:tblUsers
- フィールド情報
- USER_ID (varchar (255))
- USER_NAME (varchar (255))
サンプルスクリプトは以下のようになります。
# # PowerShell から ADO でレコードを読み込む # # 変数の宣言 $adOpenStatic = 3 $adLockOptimistic = 3 $con = New-Object -ComObject ADODB.Connection $rs = New-Object -ComObject ADODB.Recordset # スクリプトのカレントディレクトリを取得 $path = Split-Path $MyInvocation.MyCommand.Path -Parent # スクリプトのカレントディレクトリのデータベースパスを作成 $path = Join-Path $path "test.mdb" # test.accdb も可 # 拡張子によって接続文字列を切り替える # MDB 形式の場合 if (([System.IO.Path]::GetExtension($path)) -eq ".mdb") { $connectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $path" # ACCDB 形式の場合 } elseif(([System.IO.Path]::GetExtension($path)) -eq ".accdb") { $connectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = $path" # 上記以外は例外をスロー } else { throw New-Object System.Exception("Access 拡張子エラー") } # 接続をオープン $con.Open($connectionString) # レコードセットをオープン $rs.Open("SELECT * FROM tblUsers", $con, $adOpenStatic, $adLockOptimistic) # 先頭行に移動 $rs.MoveFirst() # レコードセットの最後までループ While ($rs.EOF -eq $false) { # フィールドの値を連結して出力 Write-Host $rs.Fields.Item("USER_ID").Value : $rs.Fields.Item("USER_NAME").Value # 次のレコードに移動する $rs.MoveNext() } # レコードセットを閉じる $rs.Close() # 接続を閉じる $con.Close() # COM オブジェクトをリリース(Excelと違ってなくても問題ないけど一応) [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($rs) [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($con)