WindowsのPowerShellメモ #2

#概要
PowerShellの環境設定ファイルを用意してそれをインクルードするサンプルを作成したいと思います。
毎回同じShellにDB関連接続情報を定義より１つのファイルに定義しておいて該当するShellにインクルードする方式です。

#事前確認
スクリプトが起動されるパスの情報を取得します。
そのパスから設定ファイルを参照できるようにパスを指定します。
パス関連情報取得は次のサンプルから確認できます。

現在スクリプトのパス情報を取得

~~~bash
# path.ps1
$scriptPath = Split-Path $MyInvocation.MyCommand.Path

Write-Output($scriptPath +  "/")

# 実行結果
PS C:\temp>  PowerShell -ExecutionPolicy RemoteSigned  .\path.ps1
C:\temp/
PS C:\temp>
~~~

#DB接続情報を定義
次のファイルにDB関連情報を定義します。

~~~bash
# \config\setting.ps1
#####################################
# 環境変数
#####################################
$strServer   = 'xxx.xxx.xxx.xxx';  # サーバーを指定
$strDatabase = 'xxxxx';            # データベースを指定
$strUserId   = 'xxxxx';            # ユーザーIDを指定
$strPassword = 'xxxxx';            # パスワードを指定
~~~

#修正前のソース
次は修正前のソースです。

~~~bash
# 接続情報設定
$strServer   = 'xxx.xxx.xxx.xxx';  # サーバーを指定
$strDatabase = 'xxxxx';            # データベースを指定
$strUserId   = 'xxxxx';            # ユーザーIDを指定
$strPassword = 'xxxxx';            # パスワードを指定

$cnnstr = "Data Source=$strServer;Initial Catalog=$strDatabase;User ID=$strUserId;Password=$strPassword;"

$cnn = New-Object -TypeName System.Data.SqlClient.SqlConnection $cnnstr

try {
    $cnn.Open()
    $cmd             = $cnn.CreateCommand()
    $cmd.Connection  = $cnn
    $cmd.CommandText = "select id, name, tel from  members"
    $adpter          = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $cmd;
    $ds              = New-Object -TypeName System.Data.DataSet;

    $adpter.Fill($ds)
    $table = $ds.Tables[0]

    foreach ($row in $table.Rows) {
        Write-Output($row.item("id").tostring() + "/" + $row.item("name") + "/" + $row.item("tel"))
    }
}
catch {
    Write-Output $Error[0].Exception.Message
} finally {
    $cnn.Close()
    $cnn.Dispose()
}
~~~

#修正後のソース
次は環境設定ファイルを読み込む処理に変更したソースです。

~~~bash
# 接続情報設定
#$strServer   = 'xxx.xxx.xxx.xxx';  # サーバーを指定
#$strDatabase = 'xxxxx';            # データベースを指定
#$strUserId   = 'xxxxx';            # ユーザーIDを指定
#$strPassword = 'xxxxx';            # パスワードを指定

#追加＞＞＞＞＞＞＞
#現在実行ファイルのパス取得　
$scriptPath = Split-Path $MyInvocation.MyCommand.Path
#環境変数をインクルード
. ($scriptPath + '\config\setting.ps1')
#追加＞＞＞＞＞＞＞

$cnnstr = "Data Source=$strServer;Initial Catalog=$strDatabase;User ID=$strUserId;Password=$strPassword;"

$cnn = New-Object -TypeName System.Data.SqlClient.SqlConnection $cnnstr

try {
    $cnn.Open()
    $cmd             = $cnn.CreateCommand()
    $cmd.Connection  = $cnn
    $cmd.CommandText = "select id, name, tel from  members"
    $adpter          = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $cmd;
    $ds              = New-Object -TypeName System.Data.DataSet;

    $adpter.Fill($ds)
    $table = $ds.Tables[0]

    foreach ($row in $table.Rows) {
        Write-Output($row.item("id").tostring() + "/" + $row.item("name") + "/" + $row.item("tel"))
    }
}
catch {
    Write-Output $Error[0].Exception.Message
} finally {
    $cnn.Close()
    $cnn.Dispose()
}
~~~

#実行結果
次のコマンドで確認します。
前回の実行結果と同じであることが確認できます。

~~~bash
# コマンド
PS C:\temp>  PowerShell -ExecutionPolicy RemoteSigned  .\db1.ps1
2
test1/テスト１/123-1234-1111
test2/テスト２/111-1456-1234
PS C:\temp>
~~~

#参照サイト
WindowsのPowerShellでパス文字列を操作する
https://atmarkit.itmedia.co.jp/ait/articles/0809/12/news139.html

#終わりに
今回はDB接続情報を定義して各PowerShellで利用できるようにテストしました。
Windowsで基本的に提供されているPowerShellを利用して何かDB周りの処理及びアプリケーションが作成できそうですね。