Saturday, June 07, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5 Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る。終端判定を1文字以上でも行えるよう見直し。
SQL*PLUSもどきを作る7 Disconnect 切断処理

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存
SQL*PLUSもどきを作る6(改訂版) Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する。SQL実行履歴作成機能の追加。

SQL*PLUSもどきを作る9

View-History SQL履歴からの実行機能作成

SQL*PLUSもどきを作る6(改訂版2)

Execute-Query その9で作成した機能を組み込み、さらにXMLエクスポート機能を付加。

SQL*PLUSもどきを作る10

View-Table SQL実行結果をデータグリッドビューへ表示する機能の作成

の続きです。

前回は、SQL実行結果をデータグリッドビューに表示する部分を作成しました。

今回は、この関数を実際に使用できるようにExecute-Query関数を改造します。

#=========================================================================================
# Execute-Query: QueryStringを実行する
#
# UPDATE 2008/04/28     Ver.1.0.0
#        2008/05/19     Ver.1.0.1   SQL履歴作成機能の追加
#        2008/06/03     Ver.1.0.2   履歴からの実行機能および取得データエクスポート機能の追加
#        2008/06/07     Ver.1.0.3   取得結果をデータグリッドビューに表示できるようにする
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Execute-Query([string]$ExportXmlFile, [switch]$View, [switch]$History)
{
    if ( $History )
    {
        #履歴からの実行(Ver.1.0.2 )
        $XmlFile = "$([Environment]::GetFolderPath(`"MyDocuments`"))\WindowsPowerShell\Oracle\History.xml"
        $SqlHis = View-History $XmlFile
      
        if ($SqlHis -eq $Null) { return }
    }
    
    if ( $SqlHis.Length -gt 0 )
    {
        $strSQL = $SqlHis
    }
    else
    {
        Write-Host "SQLを入力してください。" -foregroundcolor Yellow
        Write-Host "`";`"で入力を終了し、実行します。" -foregroundcolor Yellow
        
        #複数行のQueryStringを受け取る
        $strSQL = Read-MultiLine
    }
    
    #履歴の作成(Ver.1.0.1)
    Write-SqlHistory $strSQL
    
    #QueryStringを実行する
    $dtSet = Execute-QueryString $strSQL
    if ( $dtSet.Tables.Count -gt 0 )
    {
        #DataGridViewへの表示(Ver.1.0.3)
        if ( $View ) { View-Table $dtSet.Tables[0] }
        else {
            #format-tableコマンドレットでデータを表示
            $dtSet.Tables[0].Rows | format-table
        }
    }
    
    #取得データをXMLにエクスポート(Ver.1.0.2)
    if ( $ExportXmlFile.Length -gt 0 )
    {
        $dtSet.WriteXml($ExportXmlFile);
    }
}

開発ポイント

Execute-Query関数を呼び出すときに、パラメータ View を指定することで取得結果をデータグリッドビューへ表示することが可能になります。

パラメータViewはスイッチパラメータを使用しており、実行時に View パラメータが指定されると、変数$ViewがTrueになる性質を利用して、前回作成したView-Table関数を呼ぶように作成してあります。

使用方法

PS > Execute-Query -View
select * from emp;

これを実行すると、下記のようになります。

また、この関数は Histroy パラメータと同時に指定可能なので

PS > Execute-Query -View -History
select * from emp;

のように入力とすると

上図が表示され、この画面で[選択]ボタンを押すと

選択したSQLの実行結果が、データグリッドビューにが表示されます。

Saturday, June 07, 2008 10:31:53 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, June 06, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5 Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る。終端判定を1文字以上でも行えるよう見直し。
SQL*PLUSもどきを作る7 Disconnect 切断処理

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存
SQL*PLUSもどきを作る6(改訂版) Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する。SQL実行履歴作成機能の追加。

SQL*PLUSもどきを作る9

View-History SQL履歴からの実行機能作成

SQL*PLUSもどきを作る6(改訂版2)

Execute-Query その9で作成した機能を組み込み、さらにXMLエクスポート機能を付加。

の続きです。

SQLを実行する関数 Execute-Queryをさらにカスタマイズして、SQLの実行結果をDataGridViewに表示する機能を追加したいと思います。

これを実現するためにView-Tableという関数を作成しました。

今回はこの関数について説明したい思います。この関数をExecute-Query関数から呼び出す部分は次回説明したいと思います。

この関数の実行結果は下記のようになります。

このようにデータグリッドビューに表示することによって、SQL文を書き直すことなく取得結果をソートすることが可能となります。

今回作成した関数は下記の通りです。

[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
#===============================================================================
# View-DataSet: DataTableをデータグリッドへ表示する
#
# UPDATE: 2008-06-04 Ver.1.0.0
# 使用例
#   PS > View-Table [DataTable]
#
# copyright HIRO's.NET(http://hiros-dot.nte/)
#===============================================================================
function global:View-Table
{
    Param([System.Data.DataTable]$dtTbl)

    #===== Formの作成 =====
    $form = New-Object System.Windows.Forms.Form
    $form.Text = "SQL実行結果"
    $form.Width = 500
    $form.Height = 400
    
    #===== DataGridViewの作成 =====
    $dgvXML = New-Object System.Windows.Forms.DataGridView
    $dgvXML.Dock = [System.Windows.Forms.DockStyle]::Fill
    $dgvXML.DataSource = $dtTbl
    $dgvXML.ReadOnly = $True
    $form.Controls.Add($dgvXML)
    
    #===== Panelの作成 =====
    $panel1 = New-Object System.Windows.Forms.Panel
    $form.Controls.Add($panel1)
    $panel1.Dock = [System.Windows.Forms.DockStyle]::Bottom
    $panel1.Height = 30
    
    #===== [閉じる]ボタンの作成 =====
    $btnClose = New-Object System.Windows.Forms.Button
    $btnClose.Location = New-Object System.Drawing.Point(405, 4)
    $btnClose.Text = "閉じる"
    $btnClose.anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
    $btnClose.Add_Click({$form.Close()})
    $panel1.Controls.AddRange($btnClose)
    
    #===== Formを表示 =====
    $form.ShowDialog()
}

開発ポイント

・パラメータはデータテーブル

呼び出し元のExecute-Query関数は、SQLの実行結果をデータセットに取り出します。

この関数では、そのデータセット内に作成されたデータテーブルを引数として受け取っています。

データグリッドビューはDataSourceプロパティにデータテーブルをセットすると、データテーブルに含まれるデータを自動で表示してくれるのでコードが短く済んでいます。

次回は、Execute-Query関数に、今回作成したData-View-を組み込みます。

 

Friday, June 06, 2008 11:20:36 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, June 05, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5 Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る。終端判定を1文字以上でも行えるよう見直し。
SQL*PLUSもどきを作る7 Disconnect 切断処理

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存
SQL*PLUSもどきを作る6(改訂版) Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する。SQL実行履歴作成機能の追加。

SQL*PLUSもどきを作る9

View-History SQL履歴からの実行機能作成

の続きです。

 

SQL*PLUSもどきを作成する その9」でView-History 関数を作成しました。

これに伴い、SQLを実行する関数 Execute-Queryを変更し、View-History関数を使用できるようにしたいと思います。

#=========================================================================================
# Execute-Query: QueryStringを実行する
#
# UPDATE 2008/04/28     Ver.1.0.0
#        2008/05/19     Ver.1.0.1   SQL履歴作成機能の追加
#        2008/06/03     Ver.1.0.2   履歴からの実行機能および取得データエクスポート機能の追加
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Execute-Query([string]$ExportXmlFile, [switch]$History)
{
    if ( $History )
    {
        #履歴からの実行(Ver.1.0.2 )
        $XmlFile = "$([Environment]::GetFolderPath(`"MyDocuments`"))\WindowsPowerShell\Oracle\History.xml"
        $SqlHis = View-History $XmlFile
      
        if ($SqlHis -eq $Null) { return }
    }
    
    if ( $SqlHis.Length -gt 0 )
    {
        $strSQL = $SqlHis
    }
    else
    {
        Write-Host "SQLを入力してください。" -foregroundcolor Yellow
        Write-Host "`";`"で入力を終了し、実行します。" -foregroundcolor Yellow
        
        #複数行のQueryStringを受け取る
        $strSQL = Read-MultiLine
    }
    
    #履歴の作成(Ver.1.0.1)
    Write-SqlHistory $strSQL
    
    #QueryStringを実行する
    $dtSet = Execute-QueryString $strSQL
    if ( $dtSet.Tables.Count -gt 0 )
    {
        #format-tableコマンドレットでデータを表示
        $dtSet.Tables[0].Rows | format-table
    }
    
    #取得データをXMLにエクスポート(Ver.1.0.2)
    if ( $ExportXmlFile.Length -gt 0 )
    {
        $dtSet.WriteXml($ExportXmlFile);
    }
}

#エイリアス設定
Set-Alias -name EQS -value Execute-Query -scope "Global"

実は、おまけとして、SQL実行結果をXMLファイルにエクスポートする機能も付けてみました。

まずは、前回作成した関数を呼び出す方法について説明します。

関数の引数に [switch]$History というのがあるのですが(switchパラメータについてはこちらを参照)、このパラメータを指定して関数を実行するとSQL履歴実行フォームが表示される仕組みとなっています。

このフォームが閉じられると、履歴からSQLが選択されている場合には $SqlHisにそのSQLが代入されます。

この場合の実行方法は下記の通りです。

PS > eqs -History

次に、おまけのエクスポート機能ですが、この関数を

PS > eqs "C:\Work\SQL.xml"

のようにして、実行結果のエクスポート先を指定します。この場合は "C:\Work\SQL.xml" というファイルが作成されます。

このエクスポート機能は、先ほどのSQL履歴実行フォームとの併用が可能です。

併用する場合は

PS > eqs "C:\Work\SQL.xml" -History

のようにします。 これは、SQL履歴実行を行った後に、XMLエクスポートを行います。

 

Thursday, June 05, 2008 10:29:26 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, June 04, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5 Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る。終端判定を1文字以上でも行えるよう見直し。
SQL*PLUSもどきを作る7 Disconnect 切断処理

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存
SQL*PLUSもどきを作る6(改訂版) Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する。SQL実行履歴作成機能の追加。

の続きです。

「SQL*PLUSもどきを作る その6(改訂版)」の関数 Exequte-Query ではSQLを実行して、結果をコンソールに表示することが可能です。

今回、この関数をカスタマイズして、Widows FormにSQL実行履歴を表示し、再実行できるようにしたいと思います。

実行イメージは下記の通りです。

SQL実行履歴を表示するための関数を下記のように作成しました。

[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
#===============================================================================
# View-History: SQL実行履歴を表示し選択させる
#
# UPDATE: 2008-06-04 Ver.1.0.0
#
# 使用例
#   PS > View-History XMLファイルパス
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================
function global:View-History
{
    Param($XmlFile)
  
    #パスが指定されているか?
    if ( $XmlFile.Length -eq $null )
    {
      Write-Host "XMLファイルを指定してください"
      return
    }
    
    #存在するパスか?
    if ( -not $(Test-Path $XmlFile) )
    {
      Write-Host $XmlFile + "履歴ファイルが存在しません"
      return
    }
    
    #データセットを作成し、XMLファイルを読み込む
    $dtSet = New-Object System.Data.DataSet
    [void]$dtSet.ReadXml($XmlFile)
    
    #===== Formの作成 =====
    $form = New-Object System.Windows.Forms.Form
    $form.Text = "SQL実行履歴"
    $form.Width = 500
    $form.Height = 500
    
    #===== SplitContainerの作成 =====
    $splCont = New-Object System.Windows.Forms.SplitContainer
    $splCont.Orientation = [System.Windows.Forms.Orientation]::Horizontal
    $splCont.Dock = [System.Windows.Forms.DockStyle]::Fill
    $splCont.SplitterDistance = 300
    $form.Controls.Add($splCont)
    
    #===== ListViewの作成 =====
    $lsvHis = New-Object System.Windows.Forms.ListView
    $lsvHis.Dock = [System.Windows.Forms.DockStyle]::Fill
    $lsvHis.View = [System.Windows.Forms.View]::Details
    $lsvHis.Font = "MS ゴシック, 9pt"
    $lsvHis.FullRowSelect = $True
    [void]$lsvHis.Columns.Add("Date", 120)
    [void]$lsvHis.Columns.Add("SQL", 350)  
    $splCont.Panel1.Controls.Add($lsvHis)
    
    #データをリストビューに表示
    for ( $i = $dtSet.Tables[0].Rows.Count - 1; $i -ge 0; $i-- )
    {
      $itemx = New-Object System.Windows.Forms.ListViewItem
      $itemx.Text = $dtSet.Tables[0].Rows[$i]["UPDT"]
      [void]$itemx.SubItems.Add($dtSet.Tables[0].Rows[$i]["SQL"])
      [void]$lsvHis.Items.Add($itemx)
    }
    
    #===== TextBoxの作成 =====
    $txtHis = New-Object System.Windows.Forms.TextBox
    $txtHis.Dock = [System.Windows.Forms.DockStyle]::Fill
    $txtHis.Multiline = $True
    $txtHis.Font = "MS ゴシック, 9pt"
    $splCont.Panel2.Controls.Add($txtHis)
  
    #===== Panelの作成 =====
    $panel1 = New-Object System.Windows.Forms.Panel
    $form.Controls.Add($panel1)
    $panel1.Dock = [System.Windows.Forms.DockStyle]::Bottom
    $panel1.Height = 30
  
    #===== ListViewイベントの追加 =====
    $lsvHis.Add_SelectedIndexChanged({
      if ( $lsvHis.SelectedItems.Count -gt 0 )
      {
        $txtHis.Text = $lsvHis.SelectedItems[0].SubItems[1].Text
      }
    })
  
    #===== [選択]ボタンの作成 =====
    $btnSelect = New-Object System.Windows.Forms.Button
    $btnSelect.Location = New-Object System.Drawing.Point(324, 4)
    $btnSelect.Text = "選択"
    $btnSelect.anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
    $btnSelect.Add_Click({
      $form.DialogResult = [System.Windows.Forms.DialogResult]::OK
      [void]$form.Close()
    })
    $panel1.Controls.AddRange($btnSelect)
  
    #===== [閉じる]ボタンの作成 =====
    $btnClose = New-Object System.Windows.Forms.Button
    $btnClose.Location = New-Object System.Drawing.Point(405, 4)
    $btnClose.Text = "閉じる"
    $btnClose.anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
    $btnClose.Add_Click({
      $form.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
      [void]$form.Close()
    })
    $panel1.Controls.AddRange($btnClose)
    
    #===== Formを表示 =====
    if ($form.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK )
    {
      return $txtHis.Text.Trim()
    }
}

開発ポイント

1) Windows Formの作成

このフォームは、SplitContainerを配置して上下に分割し、上にリストビューを下にテキストボックスを配置しています。そのほかにはパネルを配置しており、その上に[選択]ボタンと[閉じる]ボタンをのせています。

2) 履歴の表示

この関数は、引数にXMLファイル(SQL実行履歴)のパスを受け取ります。

DataSetのReadXmlメソッドで、このXMLファイルを読み込みリストビューへ表示しています。

3) SQL選択時の処理

履歴リストで選択されたSQLはリストビューのSelectedIndexChangedを使用して、下に配置されてあるテキストボックスへ表示します。

4) [選択]ボタンクリック時の処理

選択ボタンが押されたらDialogResultをOKにしてフォームを閉じます。

このフォームはShowDialogメソッドを使用して表示されているので、DialogResultがOKだったときに、テキストボックスに表示されていたSQL文をreturnで返すようにしました。

この関数の作成に伴い、Execute-Query関数を変更する必要があるのですが、これについては次回説明したいと思います。

Wednesday, June 04, 2008 10:24:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

列挙体の確認はGetNamesメソッドを使用して、以下のように確認することが可能です。

PS > [System.ConsoleColor]::GetNames([System.ConsoleColor])
Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White

System.ConsoleColorのところを変更すれば、他の列挙体も確認することができます。

しかし、見てわかるように、System.ConsoleColor を2度書く必要があるので面倒です。

ということで、関数にしてみました。

#=========================================================================================
# Get-EnumLis: 指定された列挙体の値を表示する
#
# UPDATE 2008/06/04     Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Get-EnumList([System.Type]$enum_name)
{
    $enum_name::GetNames($enum_name)
}

この関数は、下記のようにして使用します。

PS > Get-EnumList System.ConsoleColor
Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
Wednesday, June 04, 2008 10:16:30 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, May 20, 2008

PowerShellのGet-Helpコマンドレットを使用すると、特定のコマンドレットのヘルプを参照することができます。

このとき、パラメータ -Detailed を使用すると詳細なヘルプをみることができ、その中には使用例も含まれています。

たとえば、Get-Command 調べる場合は

PS > Get-Help Get-Command -Detailed

名前
    Get-Command

概要
    コマンドレットおよびその他の Windows PowerShell コマンド要素に関する基本情報を取得し
    ます。


構文
    Get-Command [[-argumentList] <OBJECT[]>] [-verb <STRING[]>] [-noun <STRING[]>] [-tota
    lCount <INT>] [-syntax] [-pSSnapIn <STRING[]>] [<COMMONPARAMETERS>]

    Get-Command [[-name] <STRING[]>] [[-argumentList] <OBJECT[]>] [-commandType {<ALIAS>
    | <FUNCTION> | <FILTER> | <CMDLET> | <EXTERNALSCRIPT> | <APPLICATION> | <SCRIPT> | <A
    ll>}] [-totalCount <int>] [-syntax] [<CommonParameters>]


詳細説明
    Get-Command コマンドレットは、コマンドレットおよびその他の Windows PowerShell コマン
    ド要素であるファイル、関数、Windows PowerShell プロバイダに関する基本情報を取得します
    。
:
:長いので省略
:
    -------------------------- 例 1 --------------------------

    C:\PS>get-command

    このコマンドは、すべての Windows PowerShell コマンドレットの情報を取得します。 既定で
    は、コマンドの種類 ("Cmdlet")、コマンドレットの名前、および構文の一覧が表示されます。




    -------------------------- 例 2 --------------------------

    C:\PS>get-command -verb set | format-list

    このコマンドは、set 動詞を持つすべてのコマンドレットの情報を取得し、その一部の一覧を

このように、ヘルプには使用例が含まれています。

このヘルプの中から使用例だけを取り出すには

PS >(Get-Help Get-Command -Detailed).Examples

のようにします。

ただ、毎回このように入力して使用例を取得するのは面倒なので関数を作成してみました。

#=========================================================================================
# Get-Example: コマンドレットの使用例を取得する
#
# UPDATE: 2008-05-20
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Get-Examples([string]$cmdlet)
{
    (Get-Help $cmdlet -Detailed).Examples
}

この関数を使用するには、Get-Examplesの後に、使用例を取得したいコマンドレットを指定するだけです。

PS > Get-Examples Get-ExecutionPolicy

-------------------------- 例 1 --------------------------

C:\PS>get-executionpolicy


このコマンドは、シェルの現在の実行ポリシーを取得します。


Restricted

-------------------------- 例 2 --------------------------

C:\PS>set-executionpolicy RemoteSigned; get-executionPolicy


これらのコマンドは、シェルの実行ポリシーの新しいユーザー設定を設定してから、有効な実行ポ
リシーを表示します。 コマンドは、セミコロン (;) によって区切られます。 この例では、グルー
プ ポリシー設定が存在しないため、ユーザー設定がシェルで有効なポリシーです。


RemoteSigned
Tuesday, May 20, 2008 10:03:14 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Monday, May 19, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る7 Disconnect 切断処理

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存

の続きです。

前回、SQL実行履歴を保存する関数を作成しました。

今回は、SQL*PLUSもどきを作る6で作成した関数に、この機能を組み込みたいと思います。

とは、いっても一行追加するだけです。

 

#=========================================================================================
# Read-MultiLine: QueryStringを実行する
#
# UPDATE 2008/04/28		Ver.1.0.0
#        2008/05/19		Ver.1.0.1
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Execute-Query
{
	#複数行のQueryStringを受け取る
	$strSQL = Read-MultiLine
	
	#履歴の作成(Ver.1.0.1)
	Write-SqlHistory $strSQL
	
	#QueryStringを実行する
	$dtSet = Execute-QueryString $strSQL
	if ( $dtSet.Tables.Count -gt 0 )
	{
        #format-tableコマンドレットでデータを表示
        $dtSet.Tables[0].Rows | format-table
	}
}

#エイリアス設定
Set-Alias -name EQS -value Execute-Query -scope "Global"

これで、実行したSQLがXMLファイルに履歴として作成されるようになります。

Monday, May 19, 2008 5:03:30 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, May 09, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る7 Disconnect 切断処理

の続きです。

今回は、実行したSQLの履歴を保存する Write-SqlHistoryという関数を作成したので紹介します。

#================================================================================================
# Write-SqlHistory: SQL実行履歴の作成
#
# UPDATE: 2008-05-09 Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#================================================================================================
function global:Write-SqlHistory([string]$SQL)
{
  #保存可能な履歴数
  $MaxHistory = 100
  $SaveFile = "$([Environment]::GetFolderPath(`"MyDocuments`"))\WindowsPowerShell\Oracle\History.xml"
  
  $UPDT = (Get-Date).ToString("yyyy/MM/dd hh:mm:ss")
  if ( Test-Path $SaveFile )
  {
    #データセットの作成
    $dtSet = New-Object System.Data.DataSet("History_Data")
    #既存ファイルの読み込み
    [void]$dtSet.ReadXml($SaveFile)
    
    #データテーブルの取り出し
    $dtTbl = $dtSet.tables[0]
    
    #保存可能数を超えた場合
    if ( $dtTbl.Rows.Count -ge $MaxHistory )
    {
      #最初の行を削除
      $dtTbl.Rows[0].Delete()
    }
    
    #新規レコードの作成
    $dtRow = $dtTbl.NewRow()
    #データをセット
    $dtRow["UPDT"] = $UPDT
    $dtRow["SQL"] = $SQL
    #データテーブルにレコードの追加
    $dtTbl.Rows.Add($dtRow)
    #XMLファイルを作成
    $dtSet.WriteXml($SaveFile)
  }
  else
  {
    #Xmlセッティングの作成
    $settings = New-Object System.Xml.XmlWriterSettings
    #エンコーディングの指定
    $settings.Encoding = [System.Text.Encoding]::UTF8
    #インデントの指定
    $settings.Indent = $True

    #XmlWriterの作成
    $xmlWriter = [System.Xml.XmlWriter]::Create($savefile, $settings)
    #要素の追加
    $xmlWriter.WriteStartElement("History_Data")
    $xmlWriter.WriteStartElement("History")
    $xmlWriter.WriteElementString("UPDT",$UPDT)
    $xmlWriter.WriteElementString("SQL",$SQL)
    [void]$xmlWriter.WriteEndElement
    #XmlWriterのClose
    $xmlWriter.Close()
  }
}

この関数は

PS > Write-SqlHistory "SELECT * FROM EMP"

のように使用します。

関数が実行されると

<?xml version="1.0" standalone="yes"?>
<History_Data>
  <History>
    <UPDT>2008/05/09 11:03:38</UPDT>
    <SQL>select * from emp</SQL>
  </History>
  <History>
    <UPDT>2008/05/09 11:03:45</UPDT>
    <SQL>select * from tbl2</SQL>
  </History>
</History_Data>

の様なXMLファイルが作成されます。UPDTタグにはSQL実行日時が、SQLタグには実行したSQLが書き込まれます。

開発ポイント

1.保存先の確認
 Test-Pathコマンドレットで保存先のXMLファイルの存在を確認します。
 保存先がある場合はDataSetを使用してXML操作を行います。
 保存先が存在しない場合はXmlWriterで新規にXMLファイルを作成します。

2.新規XMLファイルを作成する
 保存先のXMLファイルが存在しない場合はXmlWriterでXMLファイルを作成するのですが、インデントとエンコーディング指定するために XmlWriterSettings を作成します。 こうしないとインデントがされず読みにくいXMLファイルができてしまいます。
 要素の追加には WriteStartElement を使用し、値の追加は WriteElementString にて行っています。
 要素の追加が終わったら WriteEndElement を実行します。 このとき[void]を付けないと、この行を実行したときにコンソールに実行時の文字列が表示されてしまうので注意が必要です。
 最後にCloseメソッドを実行してXmlWriterを閉じます。

3.既存のXMLファイルを読み込みデータを追加する
 既にXMLファイルが存在する場合にはDataSetを使用してXML操作を行うこととしました。
 まずはNew-Object コマンドレットでDataSetを作成し、ReadXmlメソッドでDataSetに既存XMLを読み込みます。
 DataSetは複数テーブルを格納できるオブジェクトなのでデータが入っている1つめのテーブルだけを変数 $dtTblに取り出します。
 次に、延々と履歴が保存されることのないように上限値に達していないかをチェックします。上限は$MaxHistory変数に100として格納しています。もしもデータ数が上限を超えたら(dtTbl.Rows.Countが100以上)最初の1件のデータを削除するようにしています。(Deleteメソッド)
 あとは$dtTbl.NewRow()で新規レコードを作成し、各要素にデータをセットし、テーブルへの追加を行います。
 最後にDataSetのWriteXmlメソッドを呼び出してXMLファイルを作成します。

Friday, May 09, 2008 2:49:53 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, May 08, 2008

この記事は

SQL*PLUSもどきを作る その1(PowerShell Tips)
SQL*PLUSもどきを作る その1の説明(PowerShell Tips)
SQL*PLUSもどきを作る その2(PowerShell Tips)
SQL*PLUSもどきを作る その3(PowerShell Tips) 
SQL*PLUSもどきを作る その4(PowerShell Tips) 
SQL*PLUSもどきを作る その5 改訂版(PowerShell Tips)
SQL*PLUSもどきを作る その6(PowerShell Tips)

の続きです。

今回は切断処理を行うDisconnect関数を作成しました。

とはいってもSQL*PLUSもどき(関数PSOracle)は非接続型を採用しているため、実際には切断処理は必要ありません。

しかし、PSOracle関数を実行して、動的に登録された関数やグローバル変数をいつまでも残しておくのは気持ち悪いため、Disconnect関数を作成し、それらを削除するようにしてみました。

#=========================================================================================
# Disconnect: 切断処理の実施
#
# UPDATE: 2008-05-08
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Disconnect
{
    $ret = Read-Host ($OracleConnInfo + " から切断します。よろしいですか?( Y/N )")
    if ( $ret -eq "N" )
    {
        return
    }
    
    #PSOracle用に登録したグローバル変数を削除
    Remove-Item variable:OracleDataSource
    Remove-Item variable:OracleUserID
    Remove-Item variable:OraclePassword
    Remove-Item variable:OracleConnInfo

    #Oracle専用スクリプトファイルを格納しているディレクトリの設定
    $OracleScriptPath = "$([Environment]::GetFolderPath(`"MyDocuments`"))\WindowsPowerShell\Oracle"
    
    #存在するパス?
    if ( Test-Path $OracleScriptPath )
    {
        #PSOracle用に登録された関数の削除(長いので折り返しています。実際には1行        Get-ChildItem $OracleScriptPath -Include "*.ps1" -Recurse -Force | 
% { Remove-Item ("function:" + [System.IO.Path]::GetFileNameWithoutExtension($_.Fullname)) }
    }
    else
    {
        #実行可能なスクリプトがない場合は処理終了
        return
    }
}

使用方法ですが下記のように関数をコールするだけです。

PS > Disconnect

これで、PSOracle関連の関数は使用することができなくなります。

開発ポイント

変数と関数の削除

変数や関数を削除するにはRemove-Itemコマンドレットを使用します。

変数を削除するには Remove-Item Variable:変数名 とします。

たとえば $OracleDataSouurceを削除する場合は変数の$を取って

PS > Remove-Item variable:OracleDataSource

とします。

関数の削除も同様にして、Remove-Item function:関数名 とします。

PSOracleによって登録された関数のリストをどうやって取得するか悩みました。

登録した関数のリストを取得するいいアイディアが浮かばなかったので、邪道だとは思いましたが、ファイル名=関数名.ps1 としているので、ファイル名から拡張子を取ったものをRemove-Itemコマンドレットで削除するように記述し、関数の削除を行っています。

Thursday, May 08, 2008 4:32:32 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, May 01, 2008

このBlogはhttp://techbank.jp/hiroへもクロスポストで運営しているのですが、そちらの方でRead-MultiLineメソッドの終端判定に"EOF"という文字列を指定できるかという質問がありました。

この関数はSQL*PLUSもどきで使用することを想定していたので、当初は";"が入力されたら入力を打ち切るように作りました。

(これはSQL*PLUSで実行するコマンドは";"を終端文字として判定しているからです)

しかし、このRead-MultiLineメソッドは「SQL*PLUSもどき」以外でも使用可能な関数であるため、終端判定を1文字以上でも行えるよう見直してみました。

下記が改訂版の関数です。

#=========================================================================================
# Read-MultiLine: コマンドラインから複数行の入力を受け取る
#
# UPDATE 2008/04/24		Ver.1.0.0 
#        2008/05/01		Ver.1.0.1 終了判定文字に1文字以上の文字列を指定できるよう修正
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Read-MultiLine ( [string]$prompt, [string]$endChar = ";" ){
	if ($args[0] -eq "-?" )
	{
		Write-Host @"
名前:
        Read-MultiLine

概要:
        コマンドラインから複数行文字列を取得します。

構文:
        Read-MultiLine [-prompt] [-endChar]

使用方法:
        -------------------------- 例 1 --------------------------
        `$a = Read-MultiLine
        
        この例はコマンドラインから複数行を取得し行終端が";"の場合に読み取りを中止し結果を返します。
        入力の終了を判定する文字は";"が規定値です。
        
        -------------------------- 例 2 --------------------------
        `$a = Read-MultiLine -prompt "文字列を入力してください"
        
        この例はプロンプトに"文字列を入力してください"と表示した後に入力を受け付けます。
        
        -------------------------- 例 3 --------------------------
        `$a = Read-MultiLine -endChar "#"
        
        この例は入力の終了を判定する文字を"#"とします。
        ユーザー入力の行終端が"#"である場合に、入力を中断し結果を返します
        
        -------------------------- 例 4 --------------------------
        `$a = Read-MultiLine -endChar "EOF"
        
        この例は入力の終了を判定する文字を"EOF"とします。
        ユーザー入力の行終端が"EOF"である場合に、入力を中断し結果を返します
        
"@ -foregroundcolor Cyan
        return
	}
	if ( $prompt.Length -gt 0 ){ Write-Host ($prompt + ":") }
	
	while(1)
	{
		$ip += Read-Host
		if ($ip.SubString($ip.Length - $endChar.Length) -eq $endChar){ break; }
		else{$ip += "`n"}
	}
	#Write-Host $ip
	
	
	return $ip.Substring(0, $ip.Length - $endChar.Length)
}

whileの中のif文を

if ($ip.SubString($ip.Length-1,1) -eq $endChar)

から

if ($ip.SubString($ip.Length - $endChar.Length) -eq $endChar)

へ変更しました。

Thursday, May 01, 2008 10:18:03 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, April 29, 2008

この記事は

SQL*PLUSもどきを作る その1(PowerShell Tips)
SQL*PLUSもどきを作る その1の説明(PowerShell Tips)
SQL*PLUSもどきを作る その2(PowerShell Tips)
SQL*PLUSもどきを作る その3(PowerShell Tips) 
SQL*PLUSもどきを作る その4(PowerShell Tips)
SQL*PLUSもどきを作る その5(PowerShell Tips)

の続きです。

今回は、ユーザーが入力したQueryStringを実行し結果を表示する関数 Execute-Query を紹介します。

この関数は、SQL*PLUS同様、複数行にわたるQueryStringを実行し、結果を表示することができます。

ただし、SQL*PLUSのようにいきなりSELECT文を書き始めることはできず、

PS > Execute-Query SELECT文

のように入力する必要があります。

#=========================================================================================
# Execute-Query
: QueryStringを実行する
#
# UPDATE 2008/04/28 Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Execute-Query { #複数行のQueryStringを受け取る $strSQL = Read-MultiLine #QueryStringを実行する $dtSet = Execute-QueryString $strSQL if ( $dtSet.Tables.Count -gt 0 ) { #format-tableコマンドレットでデータを表示 $dtSet.Tables[0].Rows | format-table } } #エイリアス設定 Set-Alias -name EQS -value Execute-Query -scope "Global"

開発ポイントですが、

複数行の入力を受け取ることができるようにSQL*PLUSもどきを作る その5(PowerShell Tips)で紹介した Read-MultiLine関数を使用しています。

入力を受け取った後は SQL*PLUSもどきを作る その3(PowerShell Tips)  で紹介したExecute-QueryString関数を実行し、結果を表示しています。

QueryStringを実行するたびに関数名 Execute-Query と入力するのは面倒なので、エイリアス設定をすることをおすすめします。(今回エイリアス名をEQSとしました)

使用方法および実行結果は下記の通りです。

PS > eqs
select * from
emp
;

         EMPNO ENAME          JOB                       MGR HIREDATE                  SAL COMM                   DEPTNO
         ----- -----          ---                       --- --------                  --- ----                   ------
          7369 SMITH          CLERK                    7902 1980/12/17 ...            800                            20
          7499 ALLEN          SALESMAN                 7698 1981/02/20 ...           1600 300                        30
          7521 WARD           SALESMAN                 7698 1981/02/22 ...           1250 500                        30
          7566 JONES          MANAGER                  7839 1981/04/02 ...           2975                            20
          7654 MARTIN         SALESMAN                 7698 1981/09/28 ...           1250 1400                       30
          7698 BLAKE          MANAGER                  7839 1981/05/01 ...           2850                            30
          7782 CLARK          MANAGER                  7839 1981/06/09 ...           2450                            10
          7788 SCOTT          ANALYST                  7566 1987/04/19 ...           3000                            20
          7839 KING           PRESIDENT                     1981/11/17 ...           5000                            10
          7844 TURNER         SALESMAN                 7698 1981/09/08 ...           1500 0                          30
          7876 ADAMS          CLERK                    7788 1987/05/23 ...           1100                            20
          7900 JAMES          CLERK                    7698 1981/12/03 ...            950                            30
          7902 FORD           ANALYST                  7566 1981/12/03 ...           3000                            20
          7777 HIRO

PS > eqs
select
*
from
emp
where JOB='CLERK';

         EMPNO ENAME          JOB                       MGR HIREDATE                  SAL COMM                   DEPTNO
         ----- -----          ---                       --- --------                  --- ----                   ------
          7369 SMITH          CLERK                    7902 1980/12/17 ...            800                            20
          7876 ADAMS          CLERK                    7788 1987/05/23 ...           1100                            20
          7900 JAMES          CLERK                    7698 1981/12/03 ...            950                            30

Tuesday, April 29, 2008 12:38:32 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback