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は代入された値によって型を自動で認識しますので、先ほどのように

$var = "Test"

とした場合には、変数はString型になります。また

$var = 10

とした場合はint型になります。

変数にどんな値が這いいてるかを確認するには、コマンドラインで単純に 変数名[Enter] と入力します。

PS > $var
Test

次に変数の型の確認方法ですが、コマンドラインで 変数名.GetType()[Enter] と入力します。

PS> $var.GetType()

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

Name列に表示されているのが、変数の型になります。

最後に、PowerShellではスペースを組み合わせた変数を作成することができます。

この場合は{}を使用して表す必要があります。

${var x}

次回は型を指定して変数を作成する方法について説明したいと思います。

Saturday, April 12, 2008 9:30:51 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, April 11, 2008

Group-Objectコマンドレットを使用すると、同じプロパティの値を持つオブジェクトでグルーピングを行うことができます。

たとえば私のPCの C:\Work には下記のようなファイルがあるのですが

PS C:\Work> dir


    ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Work


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2008/03/07     18:39         28 1stList.csv
-a---        2008/04/01     22:53      17226 CommandList.txt
-a---        2008/04/06     22:15      23848 PSCmd.txt
-a---        2008/03/20     22:50        880 replace.ps1
-a---        2008/03/08      0:10         89 Select.csv

これを拡張子別にグルーピングしてみたいと思います。

PS C:\Work> Get-ChildItem *.* | Group-Object Extension

Count Name                      Group
----- ----                      -----
    2 .csv                      {1stList.csv, Select.csv}
    2 .txt                      {CommandList.txt, PSCmd.txt}
    1 .ps1                      {replace.ps1}

きちんと拡張子別にグルーピングがされ、どの拡張子でグルーピングをしたのか、また要素数(Count)がいくつかなどの情報を得ることができます。

今回、Group-ObjectでExtensionを指定したのですが、ほかのメンバーを指定することも可能です。

指定可能なメンバーはパイプに渡されるオブジェクトのメンバーです。この場合はGet-ChildItemから得られるオブジェクトになります。

指定可能なメンバーの情報を取得するには

PS C:\Work> Get-ChildItem | Get-Member -MemberType property


   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   System.DateTime CreationTime {get;set;}
CreationTimeUtc   Property   System.DateTime CreationTimeUtc {get;set;}
Directory         Property   System.IO.DirectoryInfo Directory {get;}
DirectoryName     Property   System.String DirectoryName {get;}
Exists            Property   System.Boolean Exists {get;}
Extension         Property   System.String Extension {get;}
FullName          Property   System.String FullName {get;}
IsReadOnly        Property   System.Boolean IsReadOnly {get;set;}
LastAccessTime    Property   System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc Property   System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   System.DateTime LastWriteTimeUtc {get;set;}
Length            Property   System.Int64 Length {get;}
Name              Property   System.String Name {get;}

のように Get-Memberコマンドレットで調べることが可能です

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

スクリプトを実行する際に、どういうことを実行したかログを残したいことがあります。

ということで、ログを作成する関数を作成してみました。

#===============================================================================
# Write-Log: ログを作成する
# 
# 使用例1: 
#   PS > Write-Log "ログを残します"
# 使用例2:
#   PS > Write-Log "ログを残します", "C:\Work\Error.log"
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================
function global:Write-Log
{
    Param ( [String]$msg, [String]$LogFile="C:\Work\History.log" )
    
    $write_msg = ((Get-Date).ToString() + "`t" + $msg)
    Add-Content -Path $LogFile -Value $write_msg
}

使用方法について

Write-Log "ログとして残すメッセージ"

とすると、C:\Work\History.log へログメッセージを書き込みます。

毎回、ログファイルのパスを指定するのは嫌なのでデフォルト値として埋め込んであります。

C:\Work\History.logのファイルパスが気に入らない方は、関数内 Param に記述されてあるパスを書き直してください。

もう1つの使用方法ですが、

Write-Log "ログとして残すメッセージ", "C:\log.txt"

のように第2引数に、書き込むログファイルを指定する方法です。

作成されるデータは以下のようになります。

2008/04/11 18:09:42    ログとして残すメッセージ

ログを書き込んだ日付[TAB]ログメッセージ

となり、指定したファイルへアペンド書き込みを行います。

今回、アペンド書き込みをしたかったのでAdd-Contentコマンドレットを使用しました。

ファイル読み書きコマンドレットは、*-Content というコマンドレット名ですので興味がある方は

PS > Get-Command *Content

としてみてください。

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

Where-Objectコマンドレットを使用すると、特定条件でデータを抽出することができます。

今回は、このWhere-Objectコマンドレットを使用して、自PCのサービスが停止しているものだけを抽出してみたいと思います。

まずは、自PC内のサービスを取得する方法ですが、これにはGet-Serviceコマンドレットを実行します。

PS C:\Work> Get-Service

Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience
Stopped ALG Application Layer Gateway Service
Running AppHostSvc Application Host Helper Service
Running Appinfo Application Information
Stopped aspnet_state ASP.NET State Service
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Running BFE Base Filtering Engine
Running bgsvcg B's Recorder GOLD General Service
Running BITS Background Intelligent Transfer Ser...
:
:長いので省略

上記結果からわかるように、Statusが"Stopped"のものがサービスが停止している項目です。

抽出したいデータは Statusが"Stopped"のものなので

PS C:\Work> Get-Service | Where-Object { $_.Status -eq "Stopped" }

と記述します。$_ は前回も説明したように、パイプで受け取ったオブジェクトが格納されている特殊な変数です。

「Status が "Stopped"に等しい」を $_.Status = "Stopped" と書かないように注意してください。

(=は代入を意味する演算子なので、エラーになってしまいます。)

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

PS C:\Work> Get-Service | Where-Object { $_.Status -eq "Stopped" }

Status Name DisplayName
------ ---- -----------
Stopped ALG Application Layer Gateway Service
Stopped aspnet_state ASP.NET State Service
Stopped CertPropSvc Certificate Propagation
Stopped clr_optimizatio... Microsoft .NET Framework NGEN v2.0....
Stopped COMSysApp COM+ System Application
Stopped DFSR DFS Replication
Stopped dot3svc Wired AutoConfig
Stopped EapHost Extensible Authentication Protocol
Stopped ehRecvr Windows Media Center Receiver Service
Stopped ehSched Windows Media Center Scheduler Service
Stopped ehstart Windows Media Center Service Launcher
Stopped FontCache3.0.0.0 Windows Presentation Foundation Fon...
:
:長いので省略

次回はグルーピングを行うGroup-Objectコマンドレットについて説明したいと思います。

Thursday, April 10, 2008 11:06:43 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

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

今回は変数と演算子についての説明です。

演算子についてはぜひリファレンスとしてご活用ください。


Thursday, April 10, 2008 10:51:01 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, April 09, 2008

今回は、パイプ演算子と共に使用する Select-Objectコマンドレットを紹介します。

Select-Objectコマンドレットはオブジェクトまたは一連のオブジェクトの指定されたプロパティを選択します。

Get-ChildItemコマンドレットが持つプロパティの指定したものだけを抜き出してみましょう。

その前に Get-ChildItemコマンドレットで取得可能なプロパティを調査してみます。

Get-Memberコマンドレットで-MmemberTypeパラメータにpropertyと指定することでプロパティのみを表示します。

PS C:\Work> Get-ChildItem | Get-Member -MemberType property


TypeName: System.IO.DirectoryInfo

Name MemberType Definition
---- ---------- ----------
Attributes Property System.IO.FileAttributes Attributes {get;set;}
CreationTime Property System.DateTime CreationTime {get;set;}
CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;}
Exists Property System.Boolean Exists {get;}
Extension Property System.String Extension {get;}
FullName Property System.String FullName {get;}
LastAccessTime Property System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime Property System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;}
Name Property System.String Name {get;}
Parent Property System.IO.DirectoryInfo Parent {get;}
Root Property System.IO.DirectoryInfo Root {get;}


TypeName: System.IO.FileInfo

Name MemberType Definition
---- ---------- ----------
Attributes Property System.IO.FileAttributes Attributes {get;set;}
CreationTime Property System.DateTime CreationTime {get;set;}
CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;}
Directory Property System.IO.DirectoryInfo Directory {get;}
DirectoryName Property System.String DirectoryName {get;}
Exists Property System.Boolean Exists {get;}
Extension Property System.String Extension {get;}
FullName Property System.String FullName {get;}
IsReadOnly Property System.Boolean IsReadOnly {get;set;}
LastAccessTime Property System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime Property System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;}
Length Property System.Int64 Length {get;}
Name Property System.String Name {get;}

多くのプロパティを持っていることがわかります。

では、この中からFullNameとLastWriteTimeのみを抜き出してみましょう。

特定のプロパティを抽出するにはSelect-Objectコマンドレットを使用します。

抽出したい項目をSelect-Objectの隣にカンマで区切って記述します。

PS C:\Work> Get-ChildItem | Select-Object FullName, LastWriteTime

FullName LastWriteTime
-------- -------------
C:\Work\1stList.csv 2008/03/07 18:39:13
C:\Work\CommandList.txt 2008/04/01 22:53:20
C:\Work\PSCmd.txt 2008/04/06 22:15:18
C:\Work\replace.ps1 2008/03/20 22:50:44
C:\Work\Select.csv 2008/03/08 0:10:06

どうでしょうか?  Select-Objectコマンドレットを使用すると、必要なプロパティのみを抽出することができますね。

次回はWhere-Objectコマンドレットについて説明したいと思います。

Wednesday, April 09, 2008 10:49:22 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, April 08, 2008

Sort-Objectコマンドレットを使用すると、パイプで受け取ったデータ(オブジェクト)の並べ替えを行うことができます。

たとえば、dirコマンド(Get-ChildItemコマンドレット)で取得した結果をデータサイズ順に並べ替える例を見てみましょう。

PS C:\Work> dir | Sort-Object { $_.Length }


ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Work


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2008/03/07 18:39 28 1stList.csv
-a--- 2008/03/08 0:10 89 Select.csv
-a--- 2008/03/20 22:50 880 replace.ps1
-a--- 2008/04/01 22:53 17226 CommandList.txt
-a--- 2008/04/06 22:15 23848 PSCmd.txt

最初に、Sort-Objectコマンドレットの隣にある $_ について説明します。

パイプ演算子(|)を使用してデータを受け取ると、受け取ったデータは $_ に代入されます。$_は特殊な変数です。

$_.Length とすることで受け取ったデータのLengthプロパティを指し示すことになります。

上記の例では Sort-Object { $_.Length } としているので、データサイズ順に並べ替えることを意味します。

また、Sort-Objectコマンドレットでは並べ替えに昇順/降順を指定することが可能です。

パラメータを指定しない場合は昇順となります。(上記の例)  -descending パラメータを使用した場合は降順となります。

ということで、先ほどの並べ替えを降順でやってみましょう。

PS C:\Work> dir | Sort-Object -Descending { $_.Length }


ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Work


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2008/04/06 22:15 23848 PSCmd.txt
-a--- 2008/04/01 22:53 17226 CommandList.txt
-a--- 2008/03/20 22:50 880 replace.ps1
-a--- 2008/03/08 0:10 89 Select.csv
-a--- 2008/03/07 18:39 28 1stList.csv

次回はSelect-Objectコマンドレットについて説明したいと思います。

Tuesday, April 08, 2008 11:08:16 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

「コマンドレットはオブジェクトを返す」でさらっとパイプラインを使用しましたが、使い方について説明を行いませんでした。

今回はこのパイプラインについて説明したいと思います。

パイプラインは、パイプ演算子(|)で区切られた一連のコマンドです。

パイプラインを使用すると前のコマンドの結果(オブジェクト)を受け取り、次のコマンドへと渡します。

1つ例を見てみましょう。

PS > Get-Date | Get-Member

上記はGet-Dateコマンドレットが返すオブジェクトのメンバー一覧を表示します。

パイプ演算子を使用することで、Get-DateのオブジェクトをGet-Memberへ渡しています。

結果として、Get-Dateが持つメンバー一覧が表示されます。

次回以降のPowerShell入門のエントリーでパイプラインと共に使用するコマンドレットについて説明していきたいと思います。


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

CMD.exeで dir と入力した場合と、PowerShellでdirと入力した結果は見た目はほぼ同じです。

以下はCMD.exeでのdirコマンド

c:\Work>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 14F3-DBDF です

c:\Work のディレクトリ

2008/04/01 22:54 <DIR> .
2008/04/01 22:54 <DIR> ..
2008/03/07 18:39 28 1stList.csv
2008/04/01 22:53 17,226 CommandList.txt
2008/04/06 22:15 23,848 PSCmd.txt
2008/03/20 22:50 880 replace.ps1
2008/03/08 00:10 89 Select.csv
5 個のファイル 42,071 バイト
2 個のディレクトリ 67,029,467,136 バイトの空き領域

以下がPowerShellでのdir

PS C:\Work> dir


ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Work


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2008/03/07 18:39 28 1stList.csv
-a--- 2008/04/01 22:53 17226 CommandList.txt
-a--- 2008/04/06 22:15 23848 PSCmd.txt
-a--- 2008/03/20 22:50 880 replace.ps1
-a--- 2008/03/08 0:10 89 Select.csv

PowerShellでの例を見ると、各項目の名称が一番上に表示されていたり、Modeが表示されていたりしていますが、単に結果を文字で返していると思っていませんか?

実はPowerShellでの結果は文字ではなく、すべてオブジェクトです。

そうはいっても表示されるのは文字なので、オブジェクトを返すことになんのメリットがあるかを実感できないのではないでしょうか?

では、Get-Memberコマンドレットを使用して dirコマンド(実際にはdirはGet-ChildItemのエイリアスです)のオブジェクトを見てみましょう。


PS C:\Work> dir | Get-Member


TypeName: System.IO.FileInfo

Name MemberType Definition
---- ---------- ----------
AppendText Method System.IO.StreamWriter AppendText()
CopyTo Method System.IO.FileInfo CopyTo(String destFileName...
Create Method System.IO.FileStream Create()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(T...
CreateText Method System.IO.StreamWriter CreateText()
Decrypt Method System.Void Decrypt()
Delete Method System.Void Delete()
Encrypt Method System.Void Encrypt()
Equals Method System.Boolean Equals(Object obj)
GetAccessControl Method System.Security.AccessControl.FileSecurity Ge...
GetHashCode Method System.Int32 GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetObjectData Method System.Void GetObjectData(SerializationInfo i...
GetType Method System.Type GetType()
get_Attributes Method System.IO.FileAttributes get_Attributes()
get_CreationTime Method System.DateTime get_CreationTime()

長いので途中省略しましたが、CMD.exeのdirとは違い、多くの情報を取得することがわかっていただけたでしょうか?

たとえば、dirコマンド(実際にはGet-ChildItem)はfullnameというプロパティがあるのですか、このプロパティを使用するとファイル名のフルパスを取得することができます。

以下がdirが返すオブジェクトであるfullnameプロパティを使用してフルパスを取得する例です(Select-Objectは後日説明したいと思います)

PS C:\Work> dir | Select-Object {$_.fullname}

$_.fullname
-----------
C:\Work\1stList.csv
C:\Work\CommandList.txt
C:\Work\PSCmd.txt
C:\Work\replace.ps1
C:\Work\Select.csv

このようにPowerShellではオブジェクトを返すため、必要な情報だけを抜き出して表示したり、さらに多くの情報を表示させたり、取得した結果を用いて計算したりすることが可能です。

Monday, April 07, 2008 10:55:47 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

SQL Server 2008にはPowerShellが搭載される予定です。

これはSQL Server 2008のCTPで確認することができます。

SQL Server 2008のPowerShellはどこから起動するかというと、現在わかっているのはMicrosoft SQL Server Management Studioの左側のツリービューで右クリックした時に表示されるメニューの「PowerShellの起動」をクリックするということです。(右クリックしても「PowerShellの起動」がない項目もあります)

で、Microsoft SQL Server Management Studioのから起動したPowerShellのアイコンが違うことにお気づきでしょうか?通常のPowerShellのアイコンではなく、DBのアイコンとPowerShellのアイコンが合体したアイコンとなっています。


もしやとは思ったのですが、どうやらPowerShellとSQL server 2008から起動するPowerShellは実行ファイルが別物のようです。

では、SQL Server 2008のPowerShellはどこにあるかというと

C:\Program Files\Microsoft SQL Server\100\Tools\Binn

の下(Binではありません。BinのほかにBinnというフォルダがあります)に SQLPS.exe という実行ファイルがあります。

これが、SQL Server 2008のPowerShell本体となります。

SQLPS.exeの上にマウスポインタを置いてみるとわかりますが、「Microsoft SQL Server PowerShell」と表示されます。

このことからも、SQLServer専用のPowerShellだということがわかります。



で、SQLServer2008のPowerShell本体が SQLPS.exeだということがわかったので、ためしに[ファイル名を指定して実行]

SQLPS と入力して[Enter]キーを押してみたところ、見事SQL Server PowerShellが起動しました。

これで、Microsoft SQL Server Management Studio以外からも SQLServer PowerShellを起動できますね。


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

今回はPowerShellでRSSを読み込む方法を紹介します。

特に難しいことはありません。

New-Objectコマンドレットを使用してXMLオブジェクトを作成してRDFを読み込みます。

$xml = New-Object xml
$xml.Load("http://hiros-dot.net/index.rdf")

各Itemの表示は下記のようにします。

PS C:\Users\HIRO> $xml.RDF.item


about : http://hiros-dot.net
title : CodeZineに「VSTOでExcel 2007のカスタムリボンを作成する」を投稿しました
link : http://hiros-dot.net
description : CodeZineに「VSTOでExcel 2007のカスタムリボンを作成する」を投稿しました。よ
ろしかったら読んでくださいね。
date : 2008-03-29T16:11:17+09:00

about : http://hiros-dot.net
title : すべてのTipsの移行が完了しました
link : http://hiros-dot.net
description : http://hiro.wankuma.com で公開していた全Tipsを http://hiros-dot.net に移行
しました。
date : 2008-03-18T23:12:14+09:00
Sunday, April 06, 2008 11:48:15 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Saturday, April 05, 2008

PowerShellでは独自のエイリアスを作成することができます。

独自のエイリアスを作成するには Set-Alias コマンドレットを使用します。

次は Get-ChildItem に list というエイリアスを作成します。

C:\PS> Set-Alias -name list -value Get-ChildItem

エイリアスを作成した後は list と入力すると Get-ChildItem と同じ動作をするようになります。

つぎに、よく使用するアプリケーションにもエイリアスを作成してみましょう。

次は サクラエディタ に sakura というエイリアスを作成しています。

c:\PS> Set-Alias sakura "C:\Program Files\Sakura\sakura.exe"

次回からコマンドラインで sakura と入力するとサクラエディタが起動するようになります。

ちなみに

C:\ PS> sakura c:\work\test.txt

などとすると、指定したファイルをサクラエディタで開くことができます。

Saturday, April 05, 2008 11:03:19 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
エイリアスとは、コマンドレットや関数、スクリプト、ファイルなどに使用する別名のことです。

各コマンドレットには別名がつけられており Get-Alias コマンドレットを使用して調べることができます。

試しに、コマンドラインで Get-Alias と入力して[Enter]キーを押してみてください。

PS C:\Work> get-alias

CommandType Name Definition
----------- ---- ----------
Alias ac Add-Content
Alias asnp Add-PSSnapin
Alias clc Clear-Content
Alias cli Clear-Item
Alias clp Clear-ItemProperty
Alias clv Clear-Variable
Alias cpi Copy-Item
Alias cpp Copy-ItemProperty
Alias cvpa Convert-Path
Alias diff Compare-Object
Alias epal Export-Alias
Alias epcsv Export-Csv
Alias fc Format-Custom
Alias fl Format-List
Alias foreach ForEach-Object
:
:省略
:
Alias dir Get-ChildItem
Alias erase Remove-Item
Alias move Move-Item
Alias rd Remove-Item
Alias ren Rename-Item
Alias set Set-Variable
Alias type Get-Content
Alias findop Find-OpenFile

PowerShellでは cmd.exe のdir や type コマンドを使用することが可能ですが、実はGet-ChildItem やGet-Content のエイリアスであることがわかります。

さらにUnixでの lsやcatも見られますが、これらも別名であることがわかります。

このように、エイリアスがあるおかげで、PowerShellが初めてのユーザーでも、すぐに使い始められるようになっています。

さて、今紹介したエイリアスは、cmd.exeユーザー や Unixユーザー向けのものでした。

これ以外にも、コマンドレットを単に短縮したエイリアスもあります。

たとえば、Get-Command なら gcm、 Get-WmiObject なら Gwmi といった感じです。

エイリアスからコマンドレット名を調べるには

エイリアスからコマンドレット名を調べるには Get-Alias エイリアス名 とします。

次は cd というエイリアスのコマンドレット名を調べます。

PS C:\> Get-Alias cd

CommandType Name Definition
----------- ---- ----------
Alias cd Set-Location

コマンドレット名からエイリアスを調べる

コマンドレット名からエイリアスを調べるには Get-Alias | Where { $_.Definition -eq "コマンドレット" } とします。

次は、Get-ChildItem コマンドレットのエイリアスを調べます。


PS C:\> Get-Alias | Where { $_.Definition -eq "Get-ChildItem"}

CommandType Name Definition
----------- ---- ----------
Alias gci Get-ChildItem
Alias ls Get-ChildItem
Alias dir Get-ChildItem
Saturday, April 05, 2008 10:20:47 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, April 03, 2008

PowerShellではコマンドレットの命名を一貫して

動詞-名詞

としています。

コマンドレットと使用方法の調べ方で説明したように、コマンドラインで Get-Command と入力してみるとわかります。

Get-ChildItem や Set-Location など、PowerShellで扱うコマンドレットはすべて 動詞-名詞 の形式であることを確認できます。

コマンドレットを自作する場合は、この命名規則に従うことをお勧めします。

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

PowerShellでの入力で楽をするために、以下のキー操作を覚えておくことをお勧めします。

キー 説明
右矢印/左矢印 コマンドライン内のカーソルを左または右へ移動します
[Ctrl]+左矢印/[Ctrl]+右矢印 コマンドライン内のカーソルを1単語ずつ左または右へ移動します
上矢印/下矢印 いままでに入力したコマンド履歴を上または下へ移動します。
[Home] カーソルをコマンドラインの先頭へ移動します
[End] カーソルをコマンドラインの最後尾へ移動します
[Insert] 文字の挿入モードと上書きモードを切り替えます
[Delete] カーソル位置の文字を削除します
[Backspace] カーソルの左側の文字を削除します
F7 コンソールウィンドウにコマンド履歴を表示します。ユーザーは上矢印または下矢印で履歴からコマンドを選択し、[Enter]で実行することができます
[Tab] コマンドを保管入力します。(このページのTab補完を参照)

 

Tab補完

PowerShellでは、コマンドの一部を入力して[Tab]キーを押すと、コマンドを補完しようとします。

たとえばコマンドラインで "Add-" と入力して[Tab]キーを押すと

PS> Add-Content

もう一度押すと

PS> Add-History

のように、入力した文字に続く候補を[Tab]キーが押されるごとに表示します

このタブ保管はコマンドレットのパラメータにも有効です。(パラメータは後日説明したいと思います)

たとえば "Get-ChildItem -" までをコマンドラインで入力し[Tab]キーを押していくと、Get-ChildItemコマンドレットで使用可能なパラメータを表示させることが可能です。

さらに、メソッドやプロパティについてもTab保管機能は有効です。

ためしに次のように入力してみると

PS > $a = "abc"
PS > $a.Len<TAB>

PowerShellは次のようにプロパティを保管します

PS > $a.Length

今回紹介したキー操作をぜひ覚えて、PowerShellでの入力を楽にしましょう。

Thursday, April 03, 2008 1:37:59 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

・コマンドレット

PowerShellで扱うコマンドは、「コマンドレット」と呼ばれています。

早速ですが、PowerShellを起動して、使用可能なコマンドレットの一覧を取得してみましょう。

コマンドレット一覧を取得するには、コマンドライン上で Get-Commad と入力して[Enter]キーを押します。

PS> Get-Command

結果として約130のコマンドレット一覧が表示されます。

 

・コマンドレットの使用方法を調べる

では、これらのコマンドレットの使用方法はどうやって調べるか?

PowerShellでは各コマンドレットにはテキストベースのヘルプが準備されており、Get-Help コマンドレットを使用することで使用方法を取得することができます。

ためしに、Get-ChildItemというコマンドレットの使用方法を調べてみましょう。

コマンドラインで Get-Help Get-ChildItem と入力して[Enter]キーを押します。

PS C:\Documents and Settings\HIROKI> Get-Help Get-ChildItem

名前
    Get-ChildItem

概要
    1 つ以上の指定された場所から項目および子項目を取得します。


構文
    Get-ChildItem [[-path] ] [[-filter] ] [-include ] [-exclude ] [-name] [-recur
    se] [-force] []

    Get-ChildItem [-literalPath]  [[-filter] ] [-include ] [-exclude ] [-name] [-
    recurse] [-force] []


詳細説明
    Get-Childitem コマンドレットは、1 つ以上の指定された場所から項目を取得します。 項目がコンテナの場合は、コンテナの中
    にある項目 (子項目) を取得します。 Recurse パラメータを使用して、すべての子コンテナの項目を取得できます。場所として
    指定できるのは、ディレクトリなどのファイル システムの場所や、レジストリ ハイブや証明書ストアなど、他のプロバイダに
    よって公開されている場所です。


関連するリンク
    Get-Item
    Get-Alias
    Get-Location
    Get-Process
    about_namespace

注釈
    詳細を参照するには、次のように入力してください: "get-help Get-ChildItem -detailed".
    技術情報を参照するには、次のように入力してください: "get-help Get-ChildItem -full".

と表示されたかと思います。

実は Get-Help Get-ChildItem と入力して得られた先ほどの使用方法は簡易版に過ぎません。

もっと詳細な情報を取得することが可能です。

コマンドラインで

PS> Get-Help Get-ChildItem -Detailed

と入力してみてください。結果は長いので省略しますが、先ほどよりも詳細な情報を取得できたはずです。

・使用方法を見やすくする

先ほどのやり方で詳細な使用方法を取得すると、ダラダラと1ページを超える膨大な説明が表示されます。

わざわざマウスでスクロールさせて、前に戻るのは面倒です。

こういう場合は more を使用して、ヘルプを1ページずつ表示させます。

PS> Get-Help Get-ChildItem -Detailed | more

more を使用した場合、次ページを表示するには[スペース]キー、次の行を表示するには[Enter]キー、ヘルプの表示を終了するには[Q]キーを押します。

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

インストール

PowerShellの必要要件の一つに .NET Frameworkがあります。

Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)をここからダウンロードしてインストールしてください。(OSがWindows Vistaを使用している場合はインストール済みですので、ここは省略してください)

また、PowerShell本体のインストーラは下記にあります。

・WindowsXP SP2 及び Windows Server 2003用
http://support.microsoft.com/?kbid=926140 

・Windows Vista用
http://support.microsoft.com/?kbid=928439

ダウンロードが完了したら、インストールを実行してください。

起動

PowerShellの起動は

[スタート]-[すべてのプログラム]-[Windows PowerShell 1.0]-[Windows PowerShell]

です。

 

Thursday, April 03, 2008 12:28:52 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, April 02, 2008

正式にはWindows PowerShellです。 PowerとShellの間にスペースはありません。

Microsoftが開発したPowerShellというスクリプト環境を備えた新たなシェル環境です。

「新たな」とはいっても、リリースは2006年11月ですから、1年半ほど経過しています。

開発コードMonadで公開されたのは2005年6月ですから、この世に出てから約3年も経っています。

今年はWindows Server 2008, SQL Server 2008 といった新製品が続々リリースされる年で、そのほとんどにPowerShellが標準搭載されています。 そういう意味では今年がPowerShell元年になるような気がします。

従来のコマンドプロンプトはお世辞にも高機能といえるものではありませんでした。

コマンド数は少なく、拡張性にも乏しい...

PowerShellはコマンドプロンプトで実行できるコマンドはすべて実行が可能です。また、標準搭載されているコマンド(PowerShellではコマンドレットと呼びます。以下コマンドレット)は、約130あります。

さらに特筆すべきは.NET Frameworkの恩恵を受けることができることでしょう。

私は普段、VB.NETやC#で、Windowsアプリケーションを開発しています。

PowerShellは管理者向けとよく聞きますが、決してそんなことはないと思います。(管理者の方には、まさに待っていましたと言わんばかりの優れたツールです)

自分にとってPowerShellはお手軽開発環境です。その気になればWindows Formだって表示することもできますし、何よりコンパイルがいらいないのが魅力です。

コマンドプロンプトをよく利用している方には、ぜひインストールして使っていただきたいと思います。そして、そうでない人もぜひ!!

普段 .NET Frameworkを使用して開発している方はすぐに馴染むことができるでしょう。 そうでない人へは、このブログでサポートしていきたいと思っています。

ぜひ、PowerShellの世界をご一緒しませんか?

HIRO

 

 

 

Wednesday, April 02, 2008 5:43:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

もう4月ですね。

4月と言えば、新入社員が入ってきたり、何かを始めようとしたりする時期です。

ということで、改めてWindows PowerShellについて、触ったことがない人でも理解し使用していけるように、少しずつこのBlogで取り上げていきたいと思います。(HIRO's.NETPowerShell Tipsとかぶるとは思いますが、改めて書いていきたいと思います。)

入門的なエントリーについては、タグとして「PowerShell 入門」を付加しますのでフィルタリングしてご覧ください。

もちろん、今まで通り「入門」以外についても書いていきますので、そちらもよろしくお願いします。

Wednesday, April 02, 2008 4:42:22 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

かめたろさんより[] と ::演算子、コメントの表し方について質問がありましたので、こちらで回答したいと思います。

1) []  と :: について

[]は大きく2通りの使用方法があります。

まず一つは名前空間やクラスを表します。
たとえばVB.NET で MathクラスのPowメソッドを使用する場合は

System.Math.Pow(2, 4)

のように書きます。これをPowerShellでは

[System.Math]::Pow(2, 4)

のように書きます。要するに [クラス]::メンバ と記述します。

.NET Frameworkのクラスを使用する場合は [] と :: を使用すると覚えておくとよいでしょう。

もう1つの使用方法は、型キャストです。
キャストしたい値の前に [型] を付けます。

たとえば、文字列の "3" を int型にキャストする場合は

[int]"3"

のように書きます。

 

2)コメントについて

PowerShellではコメントを#で表します。

#から行末までがコメントとなり、C#の //  VB.NETの'と同等の働きをします。

 

Wednesday, April 02, 2008 3:40:31 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, April 01, 2008

SQL Server 2008 CTPをWindows Server 2008へインストールしてみました。

とりあえず、SQL Server 2008のPowerShellでどのようなコマンドレットがあるかを調べてみました。

表の左側がSQL Server 2008のコマンドレット一覧で右側が通常のPowerShellコマンドレット一覧です。

コマンドレットの総数はSQL Server 2008が130、 通常のPowerShellが129。

今回、黄色で色づけしたコマンドレットはどちらか一方にのみ(SQL Server 2008 or PS)存在するコマンドレットです。

表を見るとわかるように、SQL Server 2008で新規に追加されたコマンドレットは

Convert-UrnToPath, Decode-SqlName, Encode-SqlName, Evaluate-Policy, Invoke-Sqlcmd

の5個です。

またPSSnapin系およびExport-Consoleコマンドレットが使用できないようになっていることがわかります。

今後、このブログでSQL Server 2008のコマンドレットについてお伝えできればと考えています

SQL Server 2008 PS PS
Add-Content Add-Content
Add-History Add-History
Add-Member Add-Member
  Add-PSSnapin
Clear-Content Clear-Content
Clear-Item Clear-Item
Clear-ItemProperty Clear-ItemProperty
Clear-Variable Clear-Variable
Compare-Object Compare-Object
ConvertFrom-SecureString ConvertFrom-SecureString
Convert-Path Convert-Path
ConvertTo-Html ConvertTo-Html
ConvertTo-SecureString ConvertTo-SecureString
Convert-UrnToPath  
Copy-Item Copy-Item
Copy-ItemProperty Copy-ItemProperty
Decode-SqlName  
Encode-SqlName  
Evaluate-Policy  
Export-Alias Export-Alias
Export-Clixml Export-Clixml
  Export-Console
Export-Csv Export-Csv
ForEach-Object ForEach-Object
Format-Custom Format-Custom
Format-List Format-List
Format-Table Format-Table
Format-Wide Format-Wide
Get-Acl Get-Acl
Get-Alias Get-Alias
Get-AuthenticodeSignature Get-AuthenticodeSignature
Get-ChildItem Get-ChildItem
Get-Command Get-Command
Get-Content Get-Content
Get-Credential Get-Credential
Get-Culture Get-Culture
Get-Date Get-Date
Get-EventLog Get-EventLog
Get-ExecutionPolicy Get-ExecutionPolicy
Get-Help Get-Help
Get-History Get-History
Get-Host Get-Host
Get-Item Get-Item
Get-ItemProperty Get-ItemProperty
Get-Location Get-Location
Get-Member Get-Member
Get-PfxCertificate Get-PfxCertificate
Get-Process Get-Process
Get-PSDrive Get-PSDrive
Get-PSProvider Get-PSProvider
  Get-PSSnapin
Get-Service Get-Service
Get-TraceSource Get-TraceSource
Get-UICulture Get-UICulture
Get-Unique Get-Unique
Get-Variable Get-Variable
Get-WmiObject Get-WmiObject
Group-Object Group-Object
Import-Alias Import-Alias
Import-Clixml Import-Clixml
Import-Csv Import-Csv
Invoke-Expression Invoke-Expression
Invoke-History Invoke-History
Invoke-Item Invoke-Item
Invoke-Sqlcmd  
Join-Path Join-Path
Measure-Command Measure-Command
Measure-Object Measure-Object
Move-Item Move-Item
Move-ItemProperty Move-ItemProperty
New-Alias New-Alias
New-Item New-Item
New-ItemProperty New-ItemProperty
New-Object New-Object
New-PSDrive New-PSDrive
New-Service New-Service
New-TimeSpan New-TimeSpan
New-Variable New-Variable
Out-Default Out-Default
Out-File Out-File
Out-Host Out-Host
Out-Null Out-Null
Out-Printer Out-Printer
Out-String Out-String
Pop-Location Pop-Location
Push-Location Push-Location
Read-Host Read-Host
Remove-Item Remove-Item
Remove-ItemProperty Remove-ItemProperty
Remove-PSDrive Remove-PSDrive
  Remove-PSSnapin
Remove-Variable Remove-Variable
Rename-Item Rename-Item
Rename-ItemProperty Rename-ItemProperty
Resolve-Path Resolve-Path
Restart-Service Restart-Service
Resume-Service Resume-Service
Select-Object Select-Object
Select-String Select-String
Set-Acl Set-Acl
Set-Alias Set-Alias
Set-AuthenticodeSignature Set-AuthenticodeSignature
Set-Content Set-Content
Set-Date Set-Date
Set-ExecutionPolicy Set-ExecutionPolicy
Set-Item Set-Item
Set-ItemProperty Set-ItemProperty
Set-Location Set-Location
Set-PSDebug Set-PSDebug
Set-Service Set-Service
Set-TraceSource Set-TraceSource
Set-Variable Set-Variable
Sort-Object Sort-Object
Split-Path Split-Path
Start-Service Start-Service
Start-Sleep Start-Sleep
Start-Transcript Start-Transcript
Stop-Process Stop-Process
Stop-Service Stop-Service
Stop-Transcript Stop-Transcript
Suspend-Service Suspend-Service
Tee-Object Tee-Object
Test-Path Test-Path
Trace-Command Trace-Command
Update-FormatData Update-FormatData
Update-TypeData Update-TypeData
Where-Object Where-Object
Write-Debug Write-Debug
Write-Error Write-Error
Write-Host Write-Host
Write-Output Write-Output
Write-Progress Write-Progress
Write-Verbose Write-Verbose
Write-Warning Write-Warning
Tuesday, April 01, 2008 10:46:17 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

Theme design by Jelle Druyts

Pick a theme: