Tuesday, April 29, 2008

whileループは、指定した条件が真の場合にループし続けます。

構文は下記の通りです。

while ( 条件 )
{
    実行する文
}

下記は変数$cntが10以下の場合ループし続けます。{ ~ }の中のコードブロックが実行される度に$cntがインクリメントされ、10以上になったときに条件を満たしループを終了します。

PS C:\Work> $cnt = 0
PS C:\Work> while ( $cnt -le 10 )
>> {
>>   Write-Host "Count: $cnt"
>>   $cnt++
>> }
>>
Count: 0
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Count: 6
Count: 7
Count: 8
Count: 9
Count: 10

ここで1つ無限ループを行う方法を紹介します。

それは条件に 1 と記述することです。

PowerShellでは0は偽、それ以外は真と見なすため 1 記述すれば無限ループするというわけです。

下記は実行すると延々と現在日時を表示し続けます。

無限ループを停止するには[Ctrl] +[C]を入力してください。

PS C:\Work> while (1)
>> {
>> Write-Host (Get-Date)
>> }
>>
Tuesday, April 29, 2008 11:25:41 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [2]  |  Trackback

今回は、PowerShell上に登録された自作関数を削除する方法を紹介します。

現在、このブログ上で「SQL*PLUSもどきを作る」を連載しているわけですが、これからDisconnect関数を作ろうと思います。

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)

その1で紹介したPSOracle関数は、動的に関係する関数を読み込むようにしてあります。

このため、PSOracle関数が実行されると、Oracle関連の関数が起動しているPowerShellに登録されることになります。

Disconnectを実行したときには、これらの関数やグローバル変数を削除したいと思っています。

調べた結果、登録された自作関数の削除には Remove-Item コマンドレットを使用すればよいことがわかりました。

ということで、本当にRemove-Itemコマンドレットを使用すれば関数を削除することができるのかを、実験してみたいと思います。

まずは、下記のように入力して、2つの値を加算する関数Addを作成します。

PS C:\Work> function Add{ $args[0]+$args[1]}

コマンドラインで、dir function: 入力すると関数の一覧を取得できます。

今作成した Add 関数があることがわかります。

PS C:\Work> dir function:

CommandType     Name                                 Definition
-----------     ----                                 ----------
Function        prompt                               'PS ' + $(Get-Location) + $(if ($...
Function        TabExpansion                         ...
Function        Clear-Host                           $spaceType = [System.Management.A...
Function        more                                 param([string[]]$paths);  if(($pa...
Function        help                                 param([string]$Name,[string[]]$Ca...
Function        man                                  param([string]$Name,[string[]]$Ca...
Function        mkdir                                param([string[]]$paths); New-Item...
Function        md                                   param([string[]]$paths); New-Item...
Function        A:                                   Set-Location A:
Function        B:                                   Set-Location B:
:
:長いので省略
:
Function        Add                                  $args[0]+$args[1]

では、実際にRemove-Itemコマンドレットを使用して Add 関数を削除してみたいと思います。

下記のように Remove-Item function:削除する関数名 とします

PS C:\Work> Remove-Item function:Add

本当に削除されたかを確認するために、再度dirコマンドを入力します。

PS C:\Work> dir function:

CommandType     Name                                 Definition
-----------     ----                                 ----------
Function        prompt                               'PS ' + $(Get-Location) + $(if ($...
Function        TabExpansion                         ...
Function        Clear-Host                           $spaceType = [System.Management.A...
Function        more                                 param([string[]]$paths);  if(($pa...
Function        help                                 param([string]$Name,[string[]]$Ca...
Function        man                                  param([string]$Name,[string[]]$Ca...
Function        mkdir                                param([string[]]$paths); New-Item...
Function        md                                   param([string[]]$paths); New-Item...
Function        A:                                   Set-Location A:
Function        B:                                   Set-Location B:
:
:長いので省略
:
Function        Z:                                   Set-Location Z:

このように、Remove-Itemコマンドレットを使用することで 関数を削除することができます。

Tuesday, April 29, 2008 10:52:27 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

この記事は

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

この記事は

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)

の続きです。

今回紹介する関数は、コマンドラインから複数行の入力を取得するというものです。

Oracle用というわけではなく普段でも使用可能な関数です。

今回、SQL*PLUSもどきを作るにあたり、SQL文をどう入力させるかを検討しました。

SQL*PLUSでは複数行にわたるSQL文の入力が可能です。 しかしPowerShellでは複数行の入力を読み取るコマンドレットがないので、自作したというわけです。

下記が、複数行の入力を受け取るRead-MultiLine関数です。

#=========================================================================================
# Read-MultiLine: コマンドラインから複数行の入力を受け取る
#
# UPDATE 2008/04/24		Ver.1.0.0 
#
# 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 "#"
        
        この例は入力の終了を判定する文字を"#"とします。
        ユーザー入力の行終端が"#"である場合に、入力を中断し結果を返します
        
"@ -foregroundcolor Cyan
        return
	}
	if ( $prompt.Length -gt 0 ){ Write-Host ($prompt + ":") }
	
	while(1)
	{
		$ip += Read-Host
		if ($ip.SubString($ip.Length-1,1) -eq $endChar){ break; }
		else{$ip += "`n"}
	}
	#Write-Host $ip
	
	
	return $ip.Substring(0, $ip.Length - $endChar.Length)
}

この関数は、実行すると";"が入力されるまで、複数行に渡る文字列の読み取りを行います。

PS > $inp = Read-MultiLine
ABC
DEF
GHI;

下記のようにするとプロンプトを表示した後に入力を受けつけます。

PS > $inp = Read-MultiLine "入力してください"
入力してください:
This
is
Read-MultiLine
Command;

また、下記のようにすると終了判定文字を";"から"#"に変更することができます。

PS > $inp = Read-MultiLine -endChar "#"
ABC
DEF
GHI#
Tuesday, April 29, 2008 12:09:21 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [2]  |  Trackback
Monday, April 28, 2008

この記事は

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

の続きです。

今回はSQL*PLUSのdescコマンドです。

describeコマンドを表現する関数を下記のように作ってみました。

#================================================================================================
# desc: Oracleのdescコマンド
#
# UPDATE: 2008-04-28    Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#================================================================================================
function global:desc ([string]$TABLE_NAME) {
    $TBL = $TABLE_NAME.ToUpper()
    
    #descコマンドを実現させるためのSQL文作成
    $QueryString = "SELECT "
    $QueryString += "COLUMN_ID,"
    $QueryString += "COLUMN_NAME,"
    $QueryString += "DECODE(NULLABLE,'N','NOT NULL') NULLABLE,"
    $QueryString += "DATA_TYPE || '('  || "
    $QueryString += "DECODE(DATA_PRECISION, NULL, TO_CHAR(DATA_LENGTH),"
    $QueryString += "DECODE(DATA_SCALE,0,"
    $QueryString += "TO_CHAR(DATA_PRECISION),"
    $QueryString += "TO_CHAR(DATA_PRECISION) || ',' || TO_CHAR(DATA_SCALE))) || ')' DATATYPE "
    $QueryString += "FROM "
    $QueryString += "ALL_TAB_COLUMNS WHERE TABLE_NAME = '$TBL' ORDER BY COLUMN_ID"

    #DataSetに取得する
    $dtSet = (Execute-QueryString $QueryString)
    
    if ( $dtSet.Tables.Count -gt 0 )
    {
        #format-tableコマンドレットでデータを表示
        $dtSet.Tables[0].Rows | format-table
    }
}

使用方法はSQL*PLUSのdescコマンドと一緒で desc テーブル名/ビュー名 とします。

PS > desc emp

                    COLUMN_ID COLUMN_NAME   NULLABLE          DATATYPE
                    --------- -----------   --------          --------
                            1 EMPNO         NOT NULL          NUMBER(4)
                            2 ENAME                           VARCHAR2(10)
                            3 JOB                             VARCHAR2(9)
                            4 MGR                             NUMBER(4)
                            5 HIREDATE                        DATE(7)
                            6 SAL                             NUMBER(7,2)
                            7 COMM                            NUMBER(7,2)
                            8 DEPTNO                          NUMBER(2)

一応 More コマンドも使用可能で

PS > desc emp | more

と入力して1ページずつの表示も可能です。

リダイレクトも可能で

PS > desc emp > C:\Work\emp.txt

のようにすると 出力結果をC:\Work\emp.txtに作成します。

開発ポイントですが

descコマンドを実現するために、情報を ALL_TAB_COLUMNS から取得する。

結果の出力にformat-tableコマンドレットを使用する。

といったところでしょうか。出力をどうするかかなり悩みました。DataReaderで1行ずつ取得するとテキストの整形(列ごとにきれいに表示させる)処理を書く必要が出てくるためどうしたものかと考えていましたが、パイプでformat-tableコマンドレットへデータを渡したところきれいに表示されました。

見ていただけばわかるように、データセットにあるテーブルの行を丸投げしているだけです。

PowerShellってこういうところが非常によくできていますね。改めてすばらしいツールだと思いました。

Monday, April 28, 2008 10:06:36 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Sunday, April 27, 2008

今回はfor文について説明したいと思います。

PowerShellにおけるforループの構文は次の通りです。

for ( 初期化; 評価式; インクリメント )
{
    評価式がTrueの場合に実行するスクリプト
}

ただし、PowerShellでは比較演算子の表し方が独特であるため、慣れるまでは少し違和感があります。

比較演算子は比較演算子(PowerShell 入門) を参照ください。

c言語やC#では

for ( i = 0; i < 5; i++ )
{
}

と書くところを、PowerShellでは

for ( $i = 0; $i -lt 5; $i++ )
{
}

と記述します。

実際の使用例は下記の通りです。(for文を使用してカウントを表示する例です)

PS > for ( $i = 0; $i -lt 5; $i++ )
>> {
>>   Write-Host ("カウント" + $i)
>> }
>>
カウント0
カウント1
カウント2
カウント3
カウント4
Sunday, April 27, 2008 10:41:39 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

この記事は

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

の続きです。

今回はSelect文を実行して、取得した結果をDataSetで返す関数を紹介します。

 

#=========================================================================================
# Execute-QueryString: QueryStringを実行し結果をデータセットで返す
#
# UPDATE: 2008-04-27    Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Execute-QueryString
{
    Param ( [string]$QueryString )

    #接続文字列の作成
    $ConnectionString = (Get-OracleConnectionString $OracleUserID $OraclePassword $OracleDataSource)
    #OracleConnectionの作成
    $OraConn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
    #データセットの作成
    $dtSet = New-Object System.Data.DataSet
    #QueryStringを実行しデータを取得
    $OraDa = New-Object System.Data.OracleClient.OracleDataAdapter($QueryString, $OraConn)
    [void]$OraDa.Fill($dtSet)
    
    return $dtSet
}

この関数はSQL*PLUSもどきを作る その2(PowerShell Tips) で説明したGet-OracleConnectionString関数を使用して接続文字列を作成し、Oracleへ接続します。

このときの引数に与えているのはSQL*PLUSもどきを作る その1(PowerShell Tips)のPSOracle関数内で作成されたグローバル変数です。

OracleDataAdapterを使用して、QueryStringを実行し結果をDataSetへ格納します。

Sunday, April 27, 2008 9:29:48 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, April 25, 2008

これまでの入門記事をごらんになりたい方はこちらからどうぞ→ 

今回から何回かに分けて制御構文について説明したいと思います。

今回はif文です。

if文は条件分岐を行う上で非常に重要です。

if文の構文は下記の通りです。

if (<条件>)
{
  <ifの条件が満たされた場合に実行されるコードブロック>
}
elseif (<条件>)
{
  <elseifの条件が満たされた場合に実行されるコードブロック>
}
else
{
  <前の条件がいずれも満たされない場合に実行されるコードブロック>
}

elseif や elseは省略することが可能です。

下記はカレントディレクトリに Test.txtが存在するかどうかをチェックし、存在する場合と存在しない場合とで表示するメッセージを変えています。

PS > if ( Test-Path Test.txt)
>> {
>> Write-Host "Test.txtは存在します"
>> }
>> else
>> {
>> Write-Host "Test.txtは存在しません"
>> }
>>
Test.txtは存在しません

Friday, April 25, 2008 10:08:44 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

この記事は

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

の続きです。

今回は接続文字列を作成する関数 Get-OracleConnectionStirng関数を紹介します。

関数名が長いので任意のエイリアスを設定したり、直接関数名を変えてください。

関数を下記に示します。

#================================================================================================
# Get-OracleConnectionString: Oracle用接続文字列を作成する
#
# UPDATE: 2008-04-25 Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#================================================================================================
function global:Get-OracleConnectionString([string]$UserID, [object]$Password, [string]$DataSource)
{
    if ($args[0] -eq "-?")
    {
        Write-Host @"
名前:
        Get-OracleConnectionString

概要:
        Oracle用接続文字列を作成します

構文:
        Get-OracleConnectionString [-UserID] [-Password] [-DataSource]

使用方法:
        `$ConnString = (Get-OracleConnectString "User" "Password" "ServerName")
"@ -foregroundcolor Cyan
        return
    }
    
    #パスワードがSecureString型の場合はString型にする
    if ( $Password -is [System.Security.SecureString] )
    {
        $ptr  = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
        $pass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr);
    }
    else
    {
        $pass = $Password
    }
    
    #接続文字列を作成して返す
    return  "Data Source=$DataSource;User ID=$UserID;Password=$pass;Integrated Security=no;"
}

使用方法は

PS > Get-OracleConnectionString scott tiger OraSvr10g
Data Source=OraSvr10g;User ID=scott;Password=tiger;Integrated Security=no;

関数名の後に「ユーザー名」「パスワード」「接続先を」指定すると接続先文字列を返します。

この接続文字列はOracleClient用のものが作成されます。

また引数の「パスワード」ですが、これにはString型またはSecureString型を渡します。

SecureString型が渡された場合は、関数内部でString型に戻して接続文字列を作成します。

*で伏せられたパスワード文字列も、この関数を通して接続文字列を返すと、上記のようにパスワードが丸見えになりますので使用する場合は注意してください。

今回紹介した関数は SQL*PLUSもどきを作る その1(PowerShell Tips) の中で使用していますので、興味がある方は参考にしてみてください。

Friday, April 25, 2008 9:46:03 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, April 24, 2008

SQL*PLUSもどきを作る その1(PowerShell Tips) で紹介した関数PSOracleの説明です。

まずは使用方法ですが、コマンドラインで

PS > PSOracle

と入力します。すると「ユーザー名「パスワード」「接続先」を聞かれるので順に入力します。

ユーザー名を入力してください: scott
パスワードを入力してください: *****
接続先を入力してください: server01

Oracle 8i Release 8.1.7.1.1 -Production

うまく接続ができると、接続先のサーバーのバージョンが表示されます。

ちなみに、コマンドラインで

PS > PSOracle -?

とすると使用方法が表示されます。

では、順を追って解説していきたいと思います。

1.PSOracle用ライブラリの読み込み

PSOracle関数を呼び出すと、最初にMy Documents\WindowsPowerShell\Oracle フォルダ内にある*.ps1ファイルを読み込み、PowerShellに関数を登録します。

こうすることで、PSOracleが実行されたときに、必要な関数を登録します。

SQL*PLUSもどきで必要な関数を*.ps1ファイル化して、このフォルダに置くことで、PSOracleを拡張していくことを可能にしてます。

動的にPowerShellに関数を登録するには呼び出し演算子(&)を使用して登録しています。

2.ユーザーからの情報取得

ユーザーから情報を取得するにはRead-Hostコマンドレットを使用します。

パスワードに関しては、入力した文字が丸見えでは困るので -assecurestring パラメータを付加しています。こうすることで入力した文字は*で表示されます。

3.グローバル変数の作成

PSOracleの関数を抜けてしまうと、ユーザーから取得した接続先情報が失われてしまうのでグローバル変数に登録します。

グローバル変数の作成は Set-Variableコマンドレットを使用して -Scopeパラメータで"Global"を使用します。

ここで作成した変数に、ユーザーから取得した情報をセットすることで、関数を抜けた後でも再利用できるようにしています。

4.Oracleへ接続する

Oracleへの接続はOracleClientを使用しています。

PSOracleが読み込まれたときに、System.Data.OracleClientをロードして使用可能にしています。

接続文字列は、自作関数 Get-OracleConnectionString(次回説明予定)で作成しています。この接続情報を元にOracleへ接続してサーバ情報を取得するSQL文を実行しデータセットへ結果を取得します。

5.エラートラップ

接続時のエラートラップは trap {} で行います。

これはVB.NETやC#でいうところのcatchの部分に相当します。 VB.NETやC#を扱っているとtry部分がないのが気になるところです。 関数内で例外が発生すると trap 部分が処理されます。

 

Thursday, April 24, 2008 8:38:24 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, April 23, 2008

単項演算子には次のものがあります。

演算子 説明
++ インクリメント
-- デクリメント
+ 正の数を表す
- 負の数を表す

下記は変数の値をインクリメントします。

PS > $a = 1
PS > $a++
PS > $a
2

下記は負の数を表します。

PS > $a = -1
PS > $a
-1
Wednesday, April 23, 2008 10:58:31 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

自分が勤務している会社は、データベースがOracleなのでSQL*PLUSをよく使用します。

SQL*PLUSってCMD.EXEやPowerShellからでも

C:\Work> sqlplus

って入力すれば使用できますよね?

で、最近はCMD.EXEよりはPowerShellを使用しているので、PowerShellからSQL*PLUSを呼び出しています。

sqlplus[Enter]と入力して sqlplusを使用するとPowerShellのコマンドレットが使えなくなります。(sqlplusを起動させているので当然なのですが)

自分は欲張りなので、SQL*PLUSを起動しつつもPowerShellも使いたいと思いました。そうすれば取得結果をリダイレクトしてファイルに落としたり、Window Formへデータ渡してみたりといろいろと応用が利きそうです。

ということで、PowerShellで動くSQL*PLUSもどきを作ってみたいと思います。

とはいっても、descコマンドと、SQLの実行ができることだけを目標にしています。

今回は、SQL*PLUSもどきの入り口部分を作ってみました。

関数名はPSOracle(PowerShell で Oracleの略)です。

実行すると、ユーザー名、パスワード、接続先を聞かれるので、順に入力すると、

1.PSOracle用のその他のライブラリ(関数ファイル)をPowerShellへ登録
2. グローバル変数へ接続先情報の登録
3.実際に接続してOracleサーバーのバージョンの表示を行います

以下が関数本体(PSOracle.ps1)です。

#===============================================================================
# Get-OracleConnectionString: PowerShellで独自のOracle関連スクリプトを使用可能にする
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================

#Assemblyのロード
[void][reflection.assembly]::LoadWithPartialName("System.Data.OracleClient")

function Global:PSOracle
{
        if ($args[0] -eq "-?")
        {
                Write-Host @"
名前:
        PSOracle

概要:
        PowerShellで独自のOracle関連スクリプトを使用可能にします

構文:
        PSOracle

使用方法:
        PS > PSOracle
        ユーザー名を入力してください: USERNAME
        パスワードを入力してください: PASSWORD
        接続先を入力してください: OracleServer
"@ -foregroundcolor Cyan
        return
        }

    #Oracle専用スクリプトファイルを格納しているディレクトリの設定
    $OracleScriptPath = $([Environment]::GetFolderPath(`"MyDocuments`"))\WindowsPowerShell\Oracle"

    #存在するパス?
    if ( Test-Path $OracleScriptPath )
    {
        #呼び出し演算子(&)を使用して関数を登録
        Get-ChildItem $OracleScriptPath -Include "*.ps1" -Recurse -Force | % { &($_.Fullname); }
    }
    else
    {
        #実行可能なスクリプトがない場合は処理終了
        return
    }

    #ユーザーから接続先情報を取得する
    $UserID = Read-Host "ユーザー名を入力してください"
    $Password = Read-Host "パスワードを入力してください" -assecurestring
    $DataSource = Read-Host "接続先を入力してください"

    #変数の作成
    Set-Variable -Scope "Global" -Name "OracleDataSource" -value $DataSource 
    Set-Variable -Scope "Global" -Name "OracleUserID"     -Value $UserID;
    Set-Variable -Scope "Global" -Name "OraclePassword"   -Value $Password;
    Set-Variable -Scope "Global" -Name "OracleConnInfo"   -Value "$UserID@$DataSource";

    $strSQL = "SELECT PRODUCT || 'Release ' || VERSION FROM product_component_version Where UPPER(PRODUCT) LIKE 'ORACLE%'"

    $ConnectionString = (Get-OracleConnectionString $UserID $Password $DataSource)
    $OraConn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
    $dtSet = New-Object System.Data.DataSet
    $OraDa = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL, $OraConn)
    [void]$OraDa.Fill($dtSet)

    if ( $dtSet.Tables.Count -gt 0 )
    {
        Write-Host ("`n" + $dtSet.Tables[0].Rows[0][0].ToString() + " - Production`n")
    }

    trap [System.Data.OracleClient.OracleException]
    {
        Write-Error ("接続に失敗しました。")
        break;
    }

    trap
    {
        Write-Error ($Error[0].Exception);
        break;
    }
}

詳細については次回説明したいと思います。

Wednesday, April 23, 2008 8:47:35 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, April 22, 2008

今回は包含演算子について説明したいと思います。

包含演算子は、コレクション内に指定した値が含まれているかどうかをTRUE/FALSEで返す演算子で、下記の2つがあります。

演算子 説明
-contains, -icontains, -ccontains コレクションに指定した値が含まれている
-notcontains, -inotcontais, -cnotcontains コレクションに指定した値が含まれていない

演算子の先頭に"i"をつけた場合(-icontains および -inotcontains)と先頭に何も文字を付加しない場合(-contains, -notcontains)は大文字と小文字を区別しません。また、演算子の先頭に"c"を付けた場合(-ccontains, -cnotcontains)は大文字と小文字を区別します。

下記は数値1,2,3,4,5のいずれかに3が含まれているかを評価します。1,2,3,4,5のコレクションには3が含まれているのでTrueが返されます。

PS > 1,2,3,4,5 -contains 3
True

また、下記はコレクションの中に"BANANA"が含まれているかを評価します。

PS > "ORANGE","BANANA","GRAPES" -contains "BANANA"
True
Tuesday, April 22, 2008 10:27:29 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Monday, April 21, 2008

今回は比較演算子でちょっとした実験を行ってみたいと思います。

比較演算子の説明は「比較演算子(PowerShell 入門)」を参照願います。

下記のように数値の2と2を-eq演算子で比較した場合、当然これは等しいのでTrueが返されます。

PS > 2 -eq 2
True

では、次のように数値の2と文字列"2"を比較したらどうなるでしょうか?

PS > 2 -eq "2"

この結果はTrueとなります。

ではなぜTrueとなるのでしょうか?

これはPowerShellがスカラー比較を行うためです。(スカラー比較とは2も"2"も同一視すること)

では、下記のようにキャストして比較してみたらどうなるか

PS %gt; [int]2 -eq [string]"2"
True

これも結果としては同じ値と見なされてしまい、Trueを返します。

下記のように数値型と文字列型(GetType()メソッドは型を返します)の比較はスカラー比較は適用できないため、Falseが返されます。

PS > (2).GetType() -eq "2".GetType()
False
Monday, April 21, 2008 10:31:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [2]  |  Trackback
Sunday, April 20, 2008

型演算子を使用すると、指定した値の型を判定することができます。型演算子には次のものがあります。

演算子 説明
-is 指定された型である
-isnot 指定された型ではない

演算結果はTRUEかFALSEで返されます。

次は数値の3がint型かを判定します。

判定する型は[]で括る必要があることに注意してください。

PS > 3 -is [int]
True

次の式は数値"3"の型がstring型でないことを判定します。

PS > 3 -isnot [string]
True
Sunday, April 20, 2008 10:49:57 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Saturday, April 19, 2008

置換演算子は、指定した値で元の値の一部または全体を置き換えることができます。置換演算子は下記に示すように3つあります。

演算子 説明
-replace 半角英字の大文字/小文字を区別しないで置換する。
-ireplace 半角英字の大文字/小文字を区別しないで置換する。
-creplace 半角英字の大文字/小文字を区別して置換する。

置換演算子は下記のようにして使用します

"置換対象文字列" -replace "置換したい文字(列)", "置換後の文字(列)"

下記は"Hiro"という文字列を"Hero"へ置換します

PS C:\Work> "Hiro" -replace "i","e"
Saturday, April 19, 2008 10:15:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, April 17, 2008

PowerShellには「範囲演算子」と呼ばれる演算子があります。

範囲演算子とは2つのピリオド(..)で表し

範囲の開始値..範囲の終了値

のように記述します。

1..5

記述した場合は1から5までという意味になります。

下記は1から5まで繰り返し、その値を表示します。

PS > foreach ( $cnt in 1..5 )
>> {
>> Write-Host $cnt
>> }
>>
1
2
3
4
5
Thursday, April 17, 2008 10:23:04 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, April 16, 2008

PowerShellにおける比較演算子には下記のものがあります。

演算子 説明
-eq, -ceq, --ieq 等しい
-ne, -cne, -ine 等しくない
-gt, -cgt, -igt より大きい
-ge, -cge, -ige 以上
-lt, -clt, -ilt より小さい
-le, -cle, -ile 以下
-like, -clike, -ilike ワイルドカードによる比較
一致したときにTrueを返す
-notlike, -cnotlike, -inotlike ワイルドカードによる比較
一致しなかったときにTrueを返す
-match, -cmatch, -imatch 正規表現による比較
一致したときにTrueを返す
-notmatch, -cnotmatch, -inotmatch 正規表現による比較
一致しなかったときにTrueを返す

比較演算子は与えられた引数を評価し、1つの出力(TrueまたはFalse)を返します。

各演算子の先頭が「-c」の場合は大文字と小文字の区別をします。また「-i」の場合は大文字と小文字の区別を行いません。これは先頭に「-c」や「-i」がつかないものと同一です。

いかにいくつか例を示します。

 

-eq演算子

この演算子は"等しい"(equal)を意味します。

この演算子の左側の値と右側の値が等しいかを比較します。


PS > 5 -eq 5
True

PS > 5 -eq 3
False

-ne演算子

この演算子は"等しくない"(not equal)を意味します。

この演算子の左側の値と右側の値が等しくないことを比較します。

等しくない場合にはTrueを返します。

PS > 5 -ne 3
True

PS > 3 -ne 3
False

-gt演算子

この演算子は"等しくない"(greater than)を意味します。

この演算子の左側の値が右側の値より大きいかを比較します。

右側の値より大きい場合にはTrueを返します。

PS > 5 -gt 3
True

PS > 3 -gt 5
False

-lt演算子

この演算子は"より小さい"(less than)を意味します。

この演算子の左側の値が右側の値より小さいかを比較します。

右側の値より小さい場合にはTrueを返します。

PS > 3 -lt 4
True
PS > 4 -lt 3
False

-like演算子

この演算子はワイルドカードによる曖昧検索を行います。

曖昧検索にヒットした場合はTrueを返します。

sample7の1つ目は"HIRO's.NET"の先頭が"HIRO"で始まっているかを検索します。

2つ目は"hi"で始まっているかを検索します。

3つめは演算子名の先頭に"c"を付加して、大文字と小文

別して検索を行うためFalseが返されています。

PS > "HIRO's,NET" -like "HIRO*"
True
PS > "HIRO's,NET" -like "hi*"
True
PS > "HIRO's,NET" -clike "hi*"
False

-match演算子

この演算子は正規表現による検索を行います。

マッチした場合はTrueを返します。

PS > "HIRO's.NET" -match "[a-z]IRO's.NET"
True
Wednesday, April 16, 2008 10:09:55 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

CodeZinePowerShell入門(5)が公開されました。

今回は制御構文についての説明です。

制御構文は関数やスクリプトの開発には欠かせないものですので、是非参考にして今後の開発に役立てていただければと思います。


Wednesday, April 16, 2008 5:28:03 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, April 15, 2008

PowerShellでブール値を表すにはどうすればよいでしょうか?

変数 $a に trueを直接代入しようとすると次のようになります。

PS > $a = true
用語 'true' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルとし
て認識されません。用語を確認し、再試行してください。
発生場所 行:1 文字:9
+ $a = true <<<<

true はブール値として認識しません。

実は、PowerShellではブール値を先頭に$を付けて $TRUEや$FALSE と表します。

PS > $a = $TRUE
PS > $a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Boolean                                  System.ValueType

Null値も同様に、先頭に$を付けて $NULL と表します

PS > $a = $NULL
PS > $a.GetType()
null 値の式ではメソッドを呼び出せません。
発生場所 行:1 文字:11
+ $a.GetType( <<<< )

エラーが発生していますがこれは正常な処理です。

変数の値がNullなのでGetType()メソッドを実行できずにエラーとなっているからです。

Tuesday, April 15, 2008 10:32:28 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

論理演算子は与えられた式を評価し1つの出力(TRUE or FALSE)を返します。

下記はPowerShellで使用可能な論理演算子です。

演算子 説明
-and 論理積
-or 論理和
-xor 排他的論理和
-not 論理否定
-band ビットごとの論理積
-bor ビットごとの論理和
-bxor ビットごとの排他的論理和
-bnot ビットごとの否定

いくつか例を示したいと思います。

-and 演算子

-and 演算子は、2 つの引数を評価し、両方の引数が真であるときのみ、True を返します。

たとえば

$a = (2 -gt 1) -and (5 -gt 2)

これは

「2は1より大きい且つ5は2より大きい」を$aに代入します。

この式は満たされるのでTrueとなります。

PS > $a = (2 -gt 1) -and (5 -gt 2)
PS > $a
True

-or 演算子

-or 演算子は、2 つの引数を評価し、どちらか一方または両方の引数が真であるときに、True を返します。

たとえば

$a = (2 -gt 1) -or (5 -gt 2)

これは

「2は1より大きい または 5は2より大きい」を$aに代入します。

この式は満たされるのでTrueとなります。

 

$a = (1 -gt 2) -or ( 2 -gt 5)

「1は2より大きい または 5は2より大きい」を$aに代入します。

この式は両方とも満たされないのでFalseとなります

PS > $a = (2 -gt 1) -or (5 -gt 2)
PS > $a
True

PS > $a = (1 -gt 2) -or (2 -gt 5)
PS > $a
False

-not演算子

-not演算子は、式が偽かどうかを評価します。つまり式がTrue の場合はFalseを、式がFalseの場合にはTrueを返します。

たとえば

$a = -not (2 -gt 1)

これは

2は1より大きい」の式が偽であるかを評価し$aに代入します。

の式は満たされる(真)のでFalseが代入されます。

PS > $a = -not (2 -gt 1)
PS > $a
False
Tuesday, April 15, 2008 10:12:39 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Monday, April 14, 2008

代入演算子とは、文字通り変数に値を代入するための演算子です。

PowerShellで使用可能な代入演算子には下記のものがあります。

演算子 説明
= 指定した値を変数に設定します。
+= 指定した値を変数の値に加算するか、指定した値を既存の値に追加します。
-= 指定した値を変数の値から減算します。
*= 指定した値で変数の値を乗算するか、指定した値を既存の値に追加します。
/= 指定した値で変数の値を除算します。
%= 指定した値で変数の値を除算し、余りを変数に代入します。

= 代入演算子

単一の値を代入するには

変数名(先頭が$で始まる) = 値

という書式で行います。

次の例では、$aに数値、$bに文字列(値を2重引用符で囲む)、$cに文字列の配列(カンマで区切ることで配列となる)代入しています

PS C:\Users\HIRO> $a = 3
PS C:\Users\HIRO> $a
3
PS C:\Users\HIRO> $b = "HIRO"
PS C:\Users\HIRO> $b
HIRO
PS C:\Users\HIRO> $c = "VB.NET", "C#", "PowerShell"
PS C:\Users\HIRO> $c
VB.NET
C#
PowerShell

+= 代入演算子

+=代入演算子は、変数の値を増加(インクリメント)または追加します。

$a += 3 と記述した場合、この式は $a = $a + 3 と同等です。

$a に 2が代入されている場合は、この式の結果は 5となります。

PS C:\Users\HIRO> $a = 2
PS C:\Users\HIRO> $a += 3
PS C:\Users\HIRO> $a
5

PS C:\Users\HIRO> $b = "Hel"
PS C:\Users\HIRO> $b += "lo"
PS C:\Users\HIRO> $b
Hello

-= 代入演算子

-=代入演算子は、変数の値を減少(デクリメント)します。

この演算子は文字列には使用することができないことに注意してください。

$a -= 3 と記述した場合、この式は $a = $a - 3 と同等です。

$a に 5が代入されている場合は、この式の結果は 2となります。

PS C:\Users\HIROKI> $a = 5
PS C:\Users\HIROKI> $a -= 3
PS C:\Users\HIROKI> $a
2

*= 代入演算子

*=代入演算子は、演算子の右側に記述した値で乗算を行います。

$a *= 3 と記述した場合、この式は $a = $a * 3 と同等です。

$a に 5が代入されている場合は、この式の結果は 15となります。

文字列の場合には、演算子の右側に記述した値の文だけ文字列が繰り返されます。

PS C:\Users\HIRO> $a = 5
PS C:\Users\HIRO> $a *= 3
PS C:\Users\HIRO> $a
15

PS C:\Users\HIRO> $b = "Hello"
PS C:\Users\HIRO> $b *= 3
PS C:\Users\HIRO> $b
HelloHelloHello

/= 代入演算子

/=代入演算子は、演算子の右側に記述した値で除算を行います。

この演算子は文字列には使用することができないことに注意してください。

$a /= 3 と記述した場合、この式は $a = $a / 3 と同等です。

$a に 6が代入されている場合は、この式の結果は 2となります。

PS C:\Users\HIRO> $a = 6
PS C:\Users\HIRO> $a /= 3
PS C:\Users\HIRO> $a
2

%= 代入演算子

/=代入演算子は、演算子の右側に記述した値で除算を行い、余りを代入します。

この演算子は文字列には使用することができないことに注意してください。

$a %= 3 と記述した場合、この式は $a = $a % 3 と同等です。

$a に 7が代入されている場合は、この式の結果は 1となります。

PS C:\Users\HIRO> $a = 7
PS C:\Users\HIRO> $a %= 3
PS C:\Users\HIRO> $a
1
Monday, April 14, 2008 10:40:42 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Sunday, April 13, 2008

算術演算子は四則演算を表す演算子です。

PowerShellで使用可能な算術演算子には下記のものがあります。

+ 2つの値を加算する
- 一方の値から他方の値を減算する
- 値を負の数値に変換する
* 2つの値を乗算する
/ 2つの値で除算を行う
% 除算で発生した余りを返す

また算術演算子には優先順位があります

1. - (負の数を表すマイナス記号)

2. *, /, %

3. +、- (減算を表すマイナス記号)

※かっこを使用して特定の部分を囲むと演算子の優先順位を変更することができます

2 + 8 / 2 * 3 はどうのように計算されるかというと

まず始めに 8 / 2 が計算されて4が返ってきます。

次にこの4と3を掛けます。 4 * 3 で12を返します。

最後に 2 に 先ほどの12が加算され、答えが14となります。

PS > 2 + 8 / 2 * 3
14

次に、かっこを使用して演算子の順位を変えた例を示します。

(1 + 2) * ( 3 + 4 ) は

最初に、はじめのかっこの 1 + 2 が計算されて3となります。

次に、2番目のかっこの 3 + 4が計算されて7となります。

最後に、3 * 7 を計算して21となります。

PS > (1 + 2) * ( 3 + 4 )
21
Sunday, April 13, 2008 10:00:19 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Saturday, April 12, 2008

今回はPowerShellでの変数宣言時の型の指定方法について説明します。

その前にちょっと実験をしてみたいと思います。

PS > $var = 3
PS > $var.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

上記のように数値を代入すると、変数は数値型(ここではint)になります。

では、この数値型になった変数$varに文字列を代入するとどうなるでしょうか?

PS > $var ="Test"
PS > $var.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

文字列型(string)に変更されました。このようにPowerShellの変数は、そのとき代入されている値の型となります。

PowerShellではほかの言語のようにあらかじめ型を指定することができます。

変数にあらかじめ型を指定するには、[型]$変数名 とします。

次は int型の変数 $int を作成して、3を代入します。

[int]$int = 3

$intの型を確認してみると

PS > $int.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

確かにint型になっていることを確認できます。

では、この$intへ文字列"Test"を代入しようとしたらどうでしょうか?

PS > $int = "Test"
値 "Test" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありませ
ん。"
発生場所 行:1 文字:5
+ $int  <<<< = "Test"

このように、明示的に型を指定した場合には、その型以外のデータは代入できなくなります。

次回から演算子について説明していきたいと思います。

Saturday, April 12, 2008 10:09:50 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

PowerShellはコマンドレットを実行するだけの環境ではありません。

スクリプト実行環境も備えたシェルです。

PowerShellで実行可能なスクリプトを作成していく上で(いやどんな言語においても)変数は欠かせません。

今回はPowerShellにおける変数について説明したいと思います。

PowerShellでの変数は先頭に$記号をつけます。

$var や $hensu のように表します。

変数の宣言方法ですが、New-Variableコマンドレットを使用して

New-Variable var -value "Test"

のようにするか

$var = "Test"

のように変数に値を割り当てます。

PowerShellは代入された値によって型を自動で認識しますので、先ほ