Saturday, May 31, 2008

PwerShellでの関数は、パイプラインからの値を受け取ることが可能です。

パイプラインからの渡された値は $input という自動変数に格納されます。

まずは、コンソールで下記の通り入力し、pipe-func1 という関数をPowerShellに登録しましょう。

PS > function pipe-func1
>> {
>>     foreach ($a in $input)
>>     {
>>         Write-Host $a
>>     }
>> }
>>

この関数は、パイプラインで受け取った値をforeachで1つずつ取り出し表示するという単純な関数です。

以下のようにして、この関数を実験してみてください。

PS > 1..10 | pipe-func1
1
2
3
4
5
6
7
8
9
10

1..10 というのは、1から10までを表します。(範囲演算子(PowerShell 入門)を参照ください)

結果としてこの関数は$inputに1から10までの数値を受け取り、その値を表示します。

もう1つ実験してみましょう。

PS > "apple","banana","orange" | pipe-func1
apple
banana
orange

こちらは"apple","banana","orange"という3つの値が$inputに渡され、結果その値を表示します。

Saturday, May 31, 2008 10:15:35 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, May 30, 2008

今回はSilverlightアプリケーションの開発手法について説明したいと思います。

前回の説明で、開発に必要なランタイムとSDKのインストールについて説明しました。

このほかにSilverlightの開発はテキストエディタが必要ですので、各自使い慣れているものをご使用ください。

1)開発単位ごとにフォルダを作成する

 Silverlightアプリケーションを開発する際には、アプリケーション単位ごとにフォルダを分けることをおすすめします。

 今回はSampleというフォルダを準備し、そこへファイルを作成していきます。

2)Silverlight.jsファイルを準備する

 Silverlightアプリケーションには、Silverlight.jsファイルが必要です。

 このファイルは、C:\Program Files\Microsoft Silverlight 1.0 SDK\Tools\Silverlight.js\localized の中にある Silverlight.ja-jp.js をコピーし、ファイル名をSilverlight.jsに変更します。

3)基本となるHTMLファイルを作成する

 次にHTMLファイルを作成します。下記は基本となるHTMLファイルです。

 <Title>~</Title>タグは、ご存じの通りWebブラウザに表示されるタイトルですので、任意に変更してください。

 4行目は 2)でコピーしてきたJScriptファイルです。

 5行目のcreateSilverlight.jsというファイルは、実際に表示されるSilverlightアプリケーション本体ファイルです。このファイルは自分で作る必要があります。ファイル名は任意で指定してかまわないのですが、これはMicrosoftの例に倣ってcreateSilverlight.js としています。

 2)でコピーしたファイル(Silverlight.js)は文字コードがutf-8となっています。このJScriptを正しく使用するために6行目が必要となります。

 下記を Sample.htm として Sampleフォルダに文字コードutf-8で保存してください。

<html>
  <head>
    <title>はじめての Silverlight</title>
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript" src="createSilverlight.js"></script>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
  </head>
  <body>
  </body>
</html>

4)基本HTML内にSilverlightが組み込まれるエリアを作成する

 先ほどの基本HTMLをWebブラウザで表示するだけでは、Silverlightアプリケーションとして成り立ちません。

 Silverlightが組み込まれるエリアとSilverlightオブジェクトを生成するためのスクリプトを追加する必要があります。

 4-1)Silverlightを組み込むエリアの作成

 Silverlightを組み込むエリアを作成するには<div>タグを使用して下記のように記述します。

  タグ内の「sampleHost」は、任意に名前を付けてかまいません。

<div id="sampleHost"></div>

 4-2)Silverlightオブジェクトを生成する関数を呼び出すスクリプトを追加する

 次にSileverlightオブジェクトを生成するために次のようなスクリプトを追加します。

 getElementByIdで指定している「sampleHost」という名前は4-1)で指定したものと同じである必要があります。

 また、3行目でcreateSilverlightPluginという関数を呼び出していますが、この関数で実際にSilverlightプロジェクトを生成します。この関数は createSilverlight.js に記述します。

<script type="text/javascript">
    var parentElement = document.getElementById("sampleHost");
    createSilverlightPlugin();    
</script>

ここまでをまとめるとSample.htmは下記のようになります。

<html>
  <head>
    <title>はじめての Silverlight</title>
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript" src="createSilverlight.js"></script>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
  </head>
  <body>
    <div id="sampleHost"></div>

    <script type="text/javascript">
      var parentElement = document.getElementById("sampleHost");
      createSilverlightPlugin();    
    </script>
  </body>
</html>

5)Silverlightオブジェクト本体を生成するJScriptファイルの作成

 次にSilverlightオブジェクト本体を作成するJScriptファイルですが下記のようにします。詳細については機会を改めて説明したいと思います。

 4行目はxamlファイルの参照先を示します。xamlファイルへは画像やアニメーションの設定などを記述します。

 6行目はSilverlightのプロジェクトのIDで任意に名前を付けることができますがユニークな値にする必要があります。また、ここで設定したユニークIDは3)で作成したHTMLファイルのDIVタグと連動させる必要があります。 今回ユニークIDを"sample"としているので、Sample.htmのDIVタグのIDを"sampleHost"としています。このように ユニークID + Host とする必要があることを覚えておいてください。

 8行目と9行目は、Silverlightオブジェクトの表示エリアとなります。

 14行目はSilverlightのバージョン番号を表しており、1.0を指定します。 

function createSilverlightPlugin()
{  
    Silverlight.createObject(
        "sample.xaml",                  // xamlファイルの参照先
        parentElement,                  // 親要素の定義
        "sample",                       // SilverlightプロジェクトのユニークID
        {                               
            width:'300',                // Silverlightオブジェクトの幅
            height:'300',               // Silverlightオブジェクトの高さ
            inplaceInstallPrompt:false, // インストールプロンプトを適所に表示するかどうか決定
            background:'#FF0000',       // 背景色
            isWindowless:'false',       // Windowlessモードによるプラグインを表示するかどうか決定
            framerate:'24',             // フレームレート最大値
            version:'1.0'               // Silverlightのバージョン番号
        },
        {
            onError:null,               // OnErrorのときのfunction名
            onLoad:null                 // OnLoadのときのfunction名
        },
        null);                          // イベントハンドラ名
}

6)XAMLファイル

今回は、簡単なXAMLファイルを準備しました。Hello, Silverlight World! と表示するだけのもです。

XAMLの要素についても機会を改めて説明したいと思います。

<Canvas
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock >Hello, Silverlight World!</TextBlock>
</Canvas>

7)実行

 上記のファイルをすべてSampleフォルダへ保存したら Sample.htm をダブルクリックして実行してみましょう。

 実行結果は、こちらとなります。

 今回紹介したファイルは、こちらからダウンロード可能です。

 もしもこのサンプルをローカルではなくWebサーバー上に配置して実行したときに Hello, Silverlight World! という文字が表示されない場合はMimeタイプの設定が必要です。その際、拡張子を.xaml、Mimeタイプはapplication/xaml+xml とする必要があります。

 

Friday, May 30, 2008 9:47:52 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

少しずつですがSilverlightについても取り上げていきたいと思います。

まずは、開発環境の構築について説明したいと思います。

1)ランタイムのインストール

 Silverlight アプリケーションを動作させるにはランタイムが必要です。 Microsoftのページからインストールを行ってください。

2)SDKのダウンロードとインストール

 次にSDK(Software Development Kit)をダウンロードしてインストールを行います。

 ダウンロードはこちらからどうぞ。

 次にインストールですが、ダウンロードしてきた Silverlightv1.0SDK.msiをダブルクリックし、メニューに従ってインストールしてください。

1)[Next]ボタンをクリック

2)[I Agree]を選択して[Next]をクリック

3)インストール先を選択して[Next]をクリック

4)[Install]をクリック

5)Visual Studio 2005で開発を行いたい場合は[Install]をクリック。必要ない場合は[skip]ボタンをクリックして8)へ

6)[Next]ボタンをクリック

7)[Finish]ボタンをクリック

8)[Finish]ボタンをクリック

Friday, May 30, 2008 3:50:43 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

2008/05/30までの入門記事まとめです。

1 インストールと起動
2 コマンドレットと使用方法の調べ方
3 キー操作
4 コマンドレットの命名規則
5 エイリアスとは
6 エイリアスを作成する
7 コマンドレットはオブジェクトを返す
8 パイプライン
9 データの並べ替え
10 プロパティを抽出する Select-Object
11 特定条件でデータを抽出する Where-Object
12 ログを残す関数
13 グルーピングを行う
14 変数 その1
15 変数 その2
16 算術演算子
17 代入演算子
18 論理演算子
19 Bool値とNull値の表し方
20 比較演算子
21 範囲演算子
22 置換演算子
23 型演算子
24 スカラー比較
25 包含演算子
26 単項演算子
27 if文
28 forループ
29 whileループ
30 do/whileループ
31 foreach
32

breakとcontinue

33 switch 基本構文
34 switch 大文字/小文字の区別
35 switch ワイルドカード
36 switch 正規表現
37 switch ファイル処理
38 スクリプトについて
39 比較演算子によるコレクション比較
40 スクリプトファイルの作成
41 スクリプトファイルでの引数
42 引数の初期値を指定する
43 暗黙の引数
44 引数の明示的な指定
45 引数におけるスイッチパラメータ
46 関数の基礎
47 関数ファイルを作る
48 関数をプロファイルに追加する
49 変数のスコープ その1
50 変数のスコープ その2
51 変数のスコープ その3
52 変数のスコープ その4
Friday, May 30, 2008 3:27:45 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

今回は、グローバル変数について説明したいと思います。

グローバル変数を作成するには、global修飾子を使用します。

下記のスクリプトでグローバル変数のスコープをみて行きたいと思います。

#Scope5.ps1
01 $global:glb_a = 3
02
03 function funcA
04 {
05     Write-Host "2)$glb_a"
06 }
07
08 Write-Host "1)$a"
09 funcA
10 Write-Host "3)$a"

このスクリプトの実行結果は下記の通りです。

PS C:\Work> ./scope5.ps1
1)3
2)3
3)3

グローバル変数のスコープは、Scope5.ps1が呼び出された後スクリプトが終わるまでが有効です。

さらに、スクリプトが終了し、コンソールウィンドウに戻った後もグローバル変数は生存し続けます。

図をご覧いただければわかるように、Scope5.ps1実行後に、$glb_aを確認すると、スクリプト内部で設定した値"3"が表示されています。

コマンドラインでPowerShellに登録されている変数を確認してみましょう。

変数の一覧を確認するには dir variable: とします。

PS C:\Work> dir variable:

Name                           Value
----                           -----
Error                          {CommandNotFoundException, CommandNotFoundException}
DebugPreference                SilentlyContinue
PROFILE                        C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.P...
HOME                           C:\Users\HIRO
Host                           System.Management.Automation.Internal.Host.InternalHost
MaximumHistoryCount            64
MaximumAliasCount              4096
input                          System.Array+SZArrayEnumerator
StackTrace                        場所 System.Management.Automation.CommandDiscovery.L...
ReportErrorShowSource          1
ExecutionContext               System.Management.Automation.EngineIntrinsics
true                           True
VerbosePreference              SilentlyContinue
ShellId                        Microsoft.PowerShell
glb_a                          3
false                          False
:
:長いので省略
:

このようにグローバル変数は、一度作成するとPowerShell上で使用可能な変数となります。

また、グローバル変数は別のスクリプトファイル実行時にもスコープが及びますので、使用するときは注意が必要です。

Friday, May 30, 2008 2:26:13 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, May 29, 2008

今回はprivateスコープについて説明したいと思います。

#Scope3.ps1
01 $a = 3
02 
03 function funcA
04 {
05     Write-Host "2)$a"
06     $a = "7"
07     Write-Host "3)$a"
08     funcB
09 }
10
11 function funcB
12 {
13    Write-Host "4)$a"
14 }
15
16 Write-Host "1)$a"
17 funcA
18 Write-Host "5)$a"

まずは、上記のスクリプトですが、最初にfuncAが呼び出され、funcAの中からfuncBを呼び出すように記述してあります。

このスクリプトの実行結果は下記の通りです。

PS C:\Work> ./Scope3.ps1
1)3
2)3
3)7
4)7
5)3

このスクリプトの動作について図で説明したいと思います。

1行目の変数$aはスクリプトスコープを持つ変数となるので、有効期間は赤線の通りでスクリプトファイルの最後までとなります。

次に6行目の変数$aですが、この変数はローカル変数となりfuncAが有効期間となります。

しかし、funcAからfuncBを呼び出しているため、funcAで作成したローカル変数$aの有効期間は青線で示した箇所となってしますので注意が必要です。

では、funcA内だけで有効なローカル変数を作成した場合にはどうすれば良いでしょうか?

これを実現するにはprivate修飾子を使用します。

下記はScope3.ps1をprivate修飾子を使用したものに書き換えたものです。6行目だけが変更になっています。

#Scope4.ps1
01 $a = 3
02 
03 function funcA
04 {
05     Write-Host "2)$a"
06     $script:a = "7"
07     Write-Host "3)$a"
08     funcB
09 }
10
11 function funcB
12 {
13    Write-Host "4)$a"
14 }
15
16 Write-Host "1)$a"
17 funcA
18 Write-Host "5)$a"

このスクリプトの実行結果は下記の通りです。

PS C:\Work> ./Scope4.ps1
1)3
2)3
3)7
4)3
5)3

下図はScope4.ps1での変数のスコープを表したものです。

private修飾子を使用することで、funcBへは影響を与えなくなることがわかりますね。

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

変数のスコープ その1では、スクリプトスコープを持つ変数と、関数内で有効なローカル変数について説明しました。

今回は、スクリプトスコープへのアクセスについて説明したいと思います。

その前に前回のおさらいをちょっとだけしたいと思います。

#Scope1.ps1

01 $a = 3
02
03 function Sample1
04 {
05    Write-Host "1)変数`$a=$a"
06    $a = 5
07    Write-Host "2)変数`$a=$a"
08 }
09 
10 #関数 sample1を実行
11 Sample1
12 Write-Host "3)変数`$a=$a"

1行目で作成した変数$aはスクリプトスコープを持つ変数となりますが、関数Sample1の6行目でローカル変数$aが作成されるとそれ以降関数Sample1内で$aを参照するとローカル変数である$aを参照することとなります。

これは、関数内ではローカル変数$aが優先されるからであるということは前回説明したとおりです。

ローカル変数$aが優先されている状況下の中で、スクリプトスコープを持つ$aを参照するにはどうすれば良いでしょうか?

これは、script修飾子を使用することで参照が可能になります。

このことを理解するために作成した例を下記に示します。

#Scope2.ps1
01 $a = 3
02
03 function Sample2
04 {
05     Write-Host "1)変数`$a=$a"
06     $a = 5
07     Write-Host "2)変数`$a=$a"
08     Write-Host "3)変数`$a=$script:a"
09     $script:a = 7
10     Write-Host "4)変数`$a=$script:a"
11     Write-Host "5)変数`$a=$a"
12 }
13
14 #関数 sample2を実行
15 Sample2
16 Write-Host "6)変数`$a=$a"

このスクリプトの実行結果は下記の通りです。

PS C:\Work> ./Scope2.ps1
1)変数$a=3
2)変数$a=5
3)変数$a=3
4)変数$a=7
5)変数$a=5
6)変数$a=7

最初に関数Sample2が呼び出され5行目が実行されます。ここで表示される変数はスクリプトスコープを持つ変数$aです。

次に6行目で変数$aに5を代入していますが、これはローカル変数$aとなります。

7行目で表示している変数$aはローカル変数$aです。5が表示されます。

8行目でscript修飾子を使用して、スクリプトスコープを持つ変数$aを表示しています。3が表示されます。

9行目で、スクリプトスコープを持つ変数$aに7を代入します。

10行目で、スクリプトスコープを持つ変数$aを表示します。9行目で書き換えたので7が表示されます。

11行目で、ローカル変数$aを表示します。5が表示されます。途中スクリプトスコープを持つ$aの書き換えを行いましたが影響を受けなかったことがわかります。

16行目で変数$aを表示します。この変数は関数の外なので、スクリプトスコープを持つ変数$aの表示となり7が表示されます。これは関数sample2内でscript修飾子を使用して価を7に書き換えたからです。

以上のことから

・関数内でスクリプトスコープを持つ変数へのアクセスはscript修飾子を使用する

・script修飾子を使用して値を書き換えても、同一名称のローカル変数へは影響しない

ということがおわかりいただけたかと思います。

 

Thursday, May 29, 2008 10:50:57 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

今回は、スクリプトファイルと関数内における変数のスコープについて説明したいと思います。

まずは、下記スクリプトで変数のスコープについてみていきたいと思います。左側の数字は説明上付けた行番号です。

#Scope1.ps1

01 $a = 3
02
03 function Sample1
04 {
05    Write-Host "1)変数`$a=$a"
06    $a = 5
07    Write-Host "2)変数`$a=$a"
08 }
09 
10 #関数 sample1を実行
11 Sample1
12 Write-Host "3)変数`$a=$a"

このスクリプトを実行すると結果は下記のようになります。

PS C:\Work> ./Scope1.ps1
1)変数$a=3
2)変数$a=5
3)変数$a=3

この動作について図で解説したいと思います。

まず、このスクリプトの1行目で、変数$aが作成され、3が代入されます。

この変数はスクリプト内で有効です。(1行目から12行目までがこの変数のスコープとなります)

次に、11行目で関数Sample1を呼び出します。

5行目が実行されるわけですが、ここでは1行目に作成した変数$aが参照され"3"を表示します。

次に6行目で変数$aに5を代入していますが、ここでの変数$aは1行目で作成した変数とは別のものとなります。この変数は関数Sample1内でのみ有効で生存期間は6行目から7行目までとなります。これはローカル変数と呼ばれます。

最後に、12行目が実行されるわけですが、ここでの変数$aは1行目で作成した変数$aであるため、結果として"3"が表示されます。

以上のことから

・スクリプトファイル内で作成した変数は、スクリプトファイル内すべてが有効範囲である。

・関数内で作成した変数は、関数内のみが有効範囲である。

・スクリプトファイル内で有効な変数と、関数内で作成した変数が同一名の場合は関数内で作成した変数が優先されるが、スクリプトスコープを持つ変数を上書きしない

ということがわかります。

Thursday, May 29, 2008 9:49:08 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, May 28, 2008

最近、HIROs.NETの方の更新をサボっているわけですが、そろそろVS2008系についてもまとめていきたいと思っています。

(数名からリクエストをいただいております)

Windows アプリケーションにおけるコントロールはVS2005もVS2008も一緒なので、WPFとLINQを中心にやっていきます。

まずは、このブログで1記事ずつ書いていき、まとまったらHIRO's.NETの方へアップするというスタイルでやっていこうと思いますのでよろしくお願いいたします。

これにより現在連載中のPowerShell入門の方がおろそかにならないよう気をつけたいと思います。

そのほかにもリクエストがありましたら、ご連絡ください。

HIRO

 

Wednesday, May 28, 2008 11:25:19 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

前回の「関数ファイルを作る(PowerShell 入門)」で、関数を作成して利用する方法を紹介しました。

しかし、前回の方法では、PowerShellを終了すると、せっかく登録された関数も次回起動時には無効になってしまうという問題があります。

今回は、関数をプロファイルに登録することで、PowerShell起動時に自動で登録されるようにする方法を紹介します。

まずは、プロファイルですが、これはPowerShell起動時に1度だけ読み込まれる特別なスクリプトファイルです。

このファイルは $Profile という自動変数に格納されています。

試しにコマンドラインで $Profileを確認してみましょう。

C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\Users\HIRO>

コマンドラインで下記のように入力し、メモ帳でプロファイルを開いてみましょう。

PS C:\Users\HIRO> Notepad $Profile

もしも、過去にプロファイルを作成したことがない場合は、「ファイル C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1が見つかりません。 作成しますか?」と聞かれるので、「はい」を選択してください。

あとは、下記のように入力してMicrosoft.PowerShell_profile.ps1を保存します。

function funcA
{
    Write-Host "funcAです"
}

保存が終わったら、PowerShellを再起動し、funcAを実行してみましょう。

PS C:\Users\HIRO> funcA
funcAです

このように、プロファイルに関数を記述すると、毎回PowerShellに関数を手動で登録する必要がなくなります。

(スクリプトの実行にはセキュリティ設定が必要ですので、動作しない場合は「スクリプトファイルの作成(PowerShell 入門)」を参考に設定してください。)

しかし、多数の関数をMicrosoft.PowerShell_profile.ps1に記述するのはメンテナンスが大変です。

これを解決する方法としてよこけんさんのサイトの「プロファイル活用」でスマートな方法が紹介されています。

実は、私自身もこの方法を採用させていただいております。

この方法を使用すれば、前回の「関数ファイルを作る(PowerShell 入門)」で説明したように、関数をファイルに保存し管理が可能になります。

ただし、1点だけ注意していただきたいことがあります。

それは、プロファイルに記述する関数はスコープを指定しなくても問題ありませんが、ファイルに記述する関数はglobalスコープが必要であるということです。

Wednesday, May 28, 2008 10:31:14 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, May 27, 2008

今回は、関数をファイル(*.ps1)に作成し、実行する方法について説明したいと思います。

これまでに、PowerShellに関するいろいろなサイトをみてきましたが、この件に関して詳しく解説しているところを見つけられていません。

参考になるサイトを知っている方、是非情報をお寄せください。

 

まずは、テキストエディタを開いて下記のように入力し、MyFunction.ps1 として保存してください。(説明の都合上C:\Workに保存するものとします。)

function funcA
{
    Write-Host "funcAです"
}

では、この MyFunction.ps1 にある funcA を実行するにはどうしたらよいのか?

1つの方法としては、このMyFunction.ps1に下記のように1行追加すると関数funcAを呼び出すことになります。

function funcA
{
    Write-Host "funcAです"
}

funcA    #この行を追加することでfuncAを呼び出す

よって、下記のようMyFunction.ps1を実行すれば、funcAが実行されることとなります。

PS C:\Work> ./MyFunction.ps1
funcAです

関数をコマンドラインから実行する

関数をコマンドラインから呼び出す実験をするために、MyFunction.ps1を以下のようにしてください。

function funcA
{
    Write-Host "funcAです"
}

では、この関数をコマンドラインから、コマンドレットであるかのように関数名を指定するだけで呼び出すにはどうしたら良いでしょうか?

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

関数名を記述するだけではだめなようです。

では、MyFunction.ps1にあるfuncAなので下記のようにしたらどうなるか?

PS C:\Work> ./MyFunction.ps1 funcA
PS C:\Work>

これは、エラーにもならなければ実行もされません。

実は、コマンドラインから呼び出すためには関数名の先頭にglobal修飾子が必要です。MyFunction.ps1を下記のように修正してください。

function global:funcA
{
    Write-Host "funcAです"
}

そして、関数を使用するために下記のようにしてPowerShellに関数を登録します。

PS C:\Work> ./MyFunction.ps1
PS C:\Work>

これで準備はOKです。あとはコマンドラインで関数名を記述すれば、実行されます。

PS C:\Work> funcA
funcAです

Get-ChildItemコマンドレットを使用することで、関数がPowerShellに登録されているかを確認することができます。

PS C:\Work> Get-ChildItem function:

CommandType     Name                                 Definition
-----------     ----                                 ----------
Function        prompt                               'PS ' + $(Get-Location) + $(if ($...
Function        Clear-Host                           $spaceType = [System.Management.A...
:
:長いので省略
:
Function        funcA                                Write-Host "funcAです"...

実は、今回の方法で登録した関数はPowerShellを終了すると無効になってしまいます。

次回はこの問題を解決する方法について説明したいと思います。

Tuesday, May 27, 2008 10:57:59 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Monday, May 26, 2008

今回は PowerShellでの関数の基礎について説明したいと思います。

まずは、基本構文ですが

function 関数名 {
    実行するスクリプト
}

のように記述します。

たとえば、3 + 2 を実行して表示する関数 Add は下記のように記述します。

PS > function Add { Write-Host (3 + 2) }

この関数を実行するには、コマンドラインで

PS > Add
5

とします。

引数のある関数を作成するには

function 関数名 (引数1, 引数2, 引数n) {
    実行するスクリプト
}

または、Paramキーワードを使用して

function 関数名 {
    Param(引数1, 引数2, 引数n)
    実行するスクリプト
}

のように記述します。

下記は、2つの引数を加算して返す関数Add2です。 値を返す場合には return キーワードを使用します。

PS > function Add2([int]$x, [int]$y)
>>{
>>    return ($x + $y)
>>}

この関数は、引数を2つもっているので、実行するには

PS > Add2 3 2
5

関数名の後に、値を2つスペースで区切って渡します。

Monday, May 26, 2008 11:20:45 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [2]  |  Trackback
Friday, May 23, 2008

PowerShellでは、引数に「スイッチパラメータ」と呼ばれるものを使用することができます。

スイッチパラメータを持つコマンドレットの一つに Read-Host があります。

Get-Helpコマンドで、Read-Hostのヘルプをみてみましょう。

PS > get-help read-host -Detailed

名前
    Read-Host

概要
    コンソールから入力を 1 行読み取ります。


構文
    Read-Host [[-prompt] <OBJECT>] [-asSecureString] [<CommonParameters>]


詳細説明
    コンソールから入力を 1 行読み取ります。 ユーザーに入力を要求する場合に使用できます。
    セキュリティ保護された文字列を作成する場合にも使用できます。


パラメータ
    -prompt <Object>
        これはプロンプト オブジェクトになる文字列です。 プロンプト文字列にスペースが含ま
        れている場合、そのスペースは二重引用符で囲む必要があります。

    -asSecureString <SwitchParameter>
        True に設定されてい場合、入力文字はアスタリスク (*) でエコー表示されます。 出力は
         SecureString オブジェクトになります。

    <CommonParameters>
        このコマンドレットは、次の共通パラメータをサポートします: -Verbose、-Debug、
        -ErrorAction、-ErrorVariable、および -OutVariable。詳細については、
        「get-help about_commonparameters」と入力してヘルプを参照してください。
:
:長いので省略
:

-asSecureStringのところがSwitchParameterとなっています。

-asSecureStringは引数値を必要としないパラメータであることを意味し、指定するだけで機能します。

Read-Hostはコマンドラインから1行を読み取るコマンドレットですが、-asSecureStringが指定されると入力された値は*で表されます。

PS > Read-Host -asSecureString
******
System.Security.SecureString

このように、スイッチパラメータは指定することで動作を変更することを可能にするための、引数です。

では、スイッチパラメータの作成方法についてみていきましょう。

スイッチパラメータを作成するには、スイッチパラメータにする引数の前に[switch]を付けるだけです。

下記は、単純にHelloと表示するだけのスクリプトですが、スイッチパラメータ-helpを指定すると説明が表示されるというものです。(say-hello.ps1とします)

Param ([switch]$help)

if ( $help )
{
	Write-Host "この関数は挨拶をします"
}
else
{
	Write-Host "Hello!!"
}

以下はスイッチパラメータなし呼び出した場合です。

PS C:\Work> ./say-hello.ps1
Hello!!

以下はスイッチパラメータを指定した場合です。

PS C:\Work> ./say-hello.ps1 -help
この関数は挨拶をします

スイッチパラメータの動作について理解していただけたでしょうか?

ここでスイッチパラメータのメカニズムについてみてみましょう。

スイッチパラメータは、指定すると変数に真の値(TRUE)がセットされます。

下記スクリプト(Check-Switch.ps1)を準備して実験してみましょう

param ([switch]$sw)

Write-Host $sw

スイッチパラメータを指定しない場合は、下記のようにスイッチパラメータ変数にFalseがセットされます。

PS C:\Work> ./Check-Switch
False

スイッチパラメータを指定した場合は、下記のようにスイッチパラメータ変数にTrueがセットされます。

PS C:\Work> ./Check-Switch -sw
True

ぜひ、スイッチパラメータについて理解し、今後のスクリプト開発お役立てください。

Friday, May 23, 2008 9:28:41 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, May 22, 2008

Param内に記述する引数は、明示的に指定することで、引数の順番を入れ替えることが可能です。

たとえば下記のスクリプト(sample.ps1)は、$weightと$heightの2つの引数があります。

param($weight, $height)
Write-Host ("体重:" + $weight)
Write-Host ("身長:" + $height)

まずは普通に実行してみましょう。

PS C:\Work> ./sample.ps1 60 165
体重:60
身長:165

次に、明示的に引数を指定してみましょう。

やり方は簡単で -引き数名 値 とします。

PS C:\Work> ./sample.ps1 -height 165 -weight 60
体重:60
身長:165

このように引数を明示的に指定することで、paramに記述された順番に関係なく正しく値を渡すことができます。

次の例に示すように、複数の引数がある場合は、途中まで明示的に引数を指定すれば、最後の引数は値だけ渡しても同様に動作します。

PS C:\Work> ./sample.ps1 -height 165 60
体重:60
身長:165
Thursday, May 22, 2008 10:08:16 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

CultureInfoクラスとJapaneseカレンダークラスを使用して現在の日付を和暦表示してみたいと思います。

まずは、カルチャに日本(ja-JP)を指定してCultureInfoのインスタンスを作成します。

次にこのインスタンスの.DateTimeFormat.CalendarにJapaneseCalendarをセットします。

最後に、DataTime型の日付をToStringで書式指定(ggyy年MM月dd日)することで和暦表示することができます。

*和暦変換が可能なのは明治元年9月8日からですので注意して下さい。

PS C:\Work> $ci = New-Object System.Globalization.CultureInfo("ja-JP")
PS C:\Work> $ci.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
PS C:\Work> (Get-Date).ToString("ggyy年MM月dd日", $ci)
平成20年05月22日

特定の日を和暦表示するには、下記のようにして使用します。

PS C:\Work> $ci = New-Object System.Globalization.CultureInfo("ja-JP")
PS C:\Work> $ci.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
PS C:\Work> ([DateTime]"1868/9/8").ToString("ggyy年MM月dd日", $ci)
明治01年09月08日
Thursday, May 22, 2008 9:19:48 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Wednesday, May 21, 2008

スクリプトファイルでの引数(PowerShell 入門)で、Paramキーワードを使用した引数の受け取りについて説明しました。

実はParamキーワードを使用しなくても、実行時に引数を渡し、受け取ることができます。

それには、自動変数 $args を使用します。

下記は、スクリプト実行時に渡された引数の値をコンソールに表示するという簡単なスクリプトです。ExArgs1.ps1として保存してください。

Write-Host $args

このスクリプトを下記のようにして、実験してみましょう。

PS > ./ExArgs1.ps1 "HIRO"
HIRO

実行時に渡した値は、$argsに代入されるので、結果として渡した値が表示されます。

実はこの$args変数は、複数の値を受け取ることが可能で、複数の値を受け取った場合は配列変数となります。

下記のスクリプトで実験してみましょう。ExArgs2.ps1として保存してください。

foreach ( $a in $args )
{
	Write-Host $a
}

このスクリプトを下記のようにして、実験してみましょう。

PS > ./ExArg2.ps1 "HIRO" "PowerShell"
HIRO
PowerShell

$args変数は複数の値を取得できることがおわかりいただけたでしょうか? このように、paramキーワードを使用しなくても値を受け取ることができます。

では、paramと$argsの2つを同時に使用したら、どうなるでしょうか?

下記のスクリプトで実験してみましょう。ExArgs3.ps1として保存してください。

param ($a)
Write-Host ("Paramで受け取った値 " + $a)
Write-Host ("`$argsで受け取った値 " + $args[0])

実行時に、ExArg3.ps1に値を一つだけ渡してみましょう。この結果は、下記の通りparamの引数$aに値を受け取っています。

PS > ./ExArg3.ps1 "HIRO"
Paramで受け取った値 HIRO
$argsで受け取った値

では実行時に、ExArg3.ps1に値を二つ渡した場合はどうなるでしょうか?この結果は、下記の通りでparamの引数$aには最初の値"HIRO"が、$argsにはParamで受けきれなかった値"PowerShell"が代入されます。

PS > ./ExArg3.ps1 "HIRO" "PowerShell"
Paramで受け取った値 HIRO
$argsで受け取った値 PowerShell

PowerShellでのparamと$argsの性質について理解しておくことをおすすめします。

Wednesday, May 21, 2008 10:25:17 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [4]  |  Trackback
Tuesday, May 20, 2008

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

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

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

PS > Get-Help Get-Command -Detailed

名前
    Get-Command

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


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

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


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

    C:\PS>get-command

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




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

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

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

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

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

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

のようにします。

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

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

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

PS > Get-Examples Get-ExecutionPolicy

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

C:\PS>get-executionpolicy


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


Restricted

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

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


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


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

この記事は

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

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存

の続きです。

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

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

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

 

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

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

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

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

スクリプトファイルの引数は、あらかじめ初期値を指定しておくことができます。

下記のように入力して、Get-TaxlusivePrice.ps1 として保存してください。

param ( $yen, $tax=1.05 )
write-Host $yen * $tax

このスクリプトは、引数$yen(税込み前価格)と$tax(税率)を持っており、$taxには初期値として1.05を与えてあります。

たとえば、100円の税込み金額を計算する場合は

PS C:\Work> ./Get-TaxInclusivePrice.ps1 100

105

のように、$taxにはあらかじめ1.05が与えられているため、結果として105が返されます。

税率を1.1で計算した場合には

PS C:\Work> ./Get-TaxInclusivePrice.ps1 100 1.1

110

のように、2つめの引数に1.1を渡します。

こうすると初期値1.05を1.1で上書きし、計算が実行されます。

このように、あらかじめ初期値を指定しておくと、その引数は省略が可能であり、また必要に応じて実行時に書き換えることが可能です。

Monday, May 19, 2008 3:57:27 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

スクリプトファイルで引数を使用するにはparamキーワードを使用します。

まずは、下記のように入力しsample1.ps1と名前をつけて保存してください。(説明の都合上 C:\Work に保存するものとします)

このスクリプトは$xと$yの変数にそれぞれ値を受け取り、加算結果を表示するスクリプトです。

param ( $x, $y )
Write-Host ("`$x + `$y =" + ( $x + $y ))

Param使用時の注意事項

paramキーワードのの前には、実行可能なスクリプトを記述してはいけないことに注意してください。

記述してもよいのは、コメント行と空の行のみです。

引数の渡し方

前回スクリプトの実行はフルパスで指定するか、先頭に./をつけて実行することを説明しました。

引数のあるスクリプトでは、これに加えて渡す値をスペース区切って記述します。

たとえば、このスクリプトに2と3の値を渡す場合は

PS C:\Work>> ./sample1.ps1 2 3

のようにします。このスクリプトを実際に実行すると

PS C:\Work>> ./sample1.ps1 2 3
$x + $y = 5

のようになります。

Monday, May 19, 2008 3:09:45 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Sunday, May 18, 2008

PowerShellにおけるスクリプトファイルはテキストエディタで作成することが可能で、拡張子はps1と決められています。

1)スクリプトファイルを作成する

テキストエディタ(メモ帳など)で下記のように入力して、Sample1.ps1として保存してください。(任意の場所でかまいませんが、説明の都合上C:\Workに保存したものとします)

$d = Get-Date
Write-Host ("ただいま" + $d + "です")

2)スクリプトファイルの実行権限を設定する

PowerShellでスクリプトファイルを実行するには、実行権限を設定する必要があります。

まずは下記のように入力して、自分の実行権限を確認します。

PS > Get-ExecutionPolicy

実行ポリシー 説明
Restricted すべてスクリプトの実行を禁止
AllSigned すべてのスクリプトに証明書を要求
RemoteSigned インターネットからダウロードしたスクリプトに証明書を要求
Unrestricted すべてのスクリプトの実行を許可

自分のPCにあるスクリプトが実行できればよいので、今回は下記のように入力してRemoteSignedに設定しましょう。

PS > Set-ExecutionPolicy RemoteSigned

3.スクリプトを実行する

スクリプトファイルは、ファイル名を入力しただけは実行することができません。 下記のようにファイル名の先頭に./をつけるか、フルパスで指定す