Windows PowerShell のプログラミング


 [Home]  [Index] 投稿 2015/04/28



[Microsoft TechNet] Windows PowerShell コア About トピック ((PowerShell 4.0)

 

 

 変数

変数は先頭が $ 、2文字以降がアルファベット、アルファベット、数字、アンダースコアであるような文字列です。また、${ } で囲むと任意の文字列が使用できます。

# 変数の使用例
$x = 1
$y = 3
echo $x + $y

ところで、変数はオブジェクトです。変数の型は System.Object.GetType() メソッドで知ることができます。下のサンプルは $x に整数を代入して型が Int32 になることを確認しています。

PS C:\> $x = 100

PS C:\> $x.gettype()

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

変数はコマンドレットを使って作成したり消去したり削除もできます。

Set-Variable コマンドレットのオプションを指定して変数のスコープや書き込み属性などを設定できます。

[Top]

定数 / リテラル / ヒアドキュメント

定数

PowerShell では定数は Set-Variable コマンドレットで -option constant を指定することで実現できます。

PS C:\> set-variable -name c0 -value "zero" -option constant

リテラル

16 進数

16 進数は C# と同じように表現します。

PS C:\> $x = 0xff
PS C:\> $x
255

[Top]

特殊文字

PowerShell では特殊文字を下記のように定義しています。

文字 意味
`0 Null
`a Alert (Beep 音を鳴らす)
`b Backspace (後退)
`f Form feed (改ページ)
`n New line (改行)
`r Carriage return (復帰)
`t Horizontal tab (水平タブ)
`v Vertical tab (垂直タブ)
--% (PowerShell 3.0 以上) Stop parsing (PowerShell に以後の文の解釈をやめるように指示する。
これは PowerShell の文法に従わない外部コマンドなどのパラメータを指定するときなどに使用する)

[Top]

ヒアドキュメント

PowerShell ではヒアドキュメントが使用できます。ヒアドキュメントは @' または @" で始まり '@ または "@ で終わります。※ '@ の の前に空白を入れるとエラーになります。

PS C:\> $here = @'
>> Here
>> Document
>> '@
>>
PS C:\> $here
Here
Document
PS C:\>

ヒアドキュメントは [xml] を付けることにより XML として扱うことができます。

[xm] @'
 <items>
   <item>first</item>
   <item>second</item>
 </items>
'@

[Top]


 配列・連想配列

配列

配列は .NET の配列同様、固定長です。配列は下の例のようにして初期化します。

PS C:\> $a = 1,2,3,4

PS C:\> echo $a
1
2
3
4

PS C:\> $a = @(10,11,12)

PS C:\> echo $a
10
11
12

PS C:\> $a = 0 .. 5
PS C:\> $a
0
1
2
3
4
5
PS C:\>

配列の長さは Length プロパティで取得できます。

PS C:\> $a.length
6

配列の要素は [] で指定できます。

PS C:\> $a[1]
1

Perl のような配列スライスも使用できます。

PS C:\> $a =1..9
PS C:\> $a[0,3,4]
1
4
5
PS C:\> $a[0..4]
1
2
3
4
5

連想配列

連想配列も利用できます。連想配列は下のようにして初期化します。

PS C:\> $hash = @{"a"=10; "b"=30}
PS C:\> echo $hash

Name                           Value                                                                                 
----                           -----                                                                                 
a                              10                                                                                    
b                              30 

要素の指定は [] で行えます。値の変更や要素の追加もできます。

PS C:\> $hash["a"]
10
PS C:\> $hash["c"] = 5
PS C:\> $hash["d"] = 15
PS C:\> $hash["d"]
15

連想配列の長さは Length でなく Count プロパティを使います。これは連想配列の型が Hashtable であるためです。

PS C:\> $hash.count
4

PS C:\> $hash.gettype()

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


PS C:\> $a.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

[Top]


 組み込み変数

PowerShell にも Bash や Perl のような特殊変数があります。(以下は抜粋)

変数 意味
$$ 最後に実行したコマンドの最後のトークン (下記サンプル参照)
PS C:\> dir d:\
PS C:\> $$
d:\
$? 最後に実行したコマンドレットの結果 (成功なら True, 失敗なら False)
$^ 最後に実行したコマンドの最初のトークン (下記サンプル参照)
PS C:\> dir d:\
PS C:\> $^
dir
$_ $PSItem と同じ。パイプライン中の現在のオブジェクト。
$Args コマンド引数
$Error 直近で発生したエラーのエラーオブジェクト
$Event PSEventArgs オブジェクト
$EventArgs イベントパラメータ
$False False
$Home ホームディレクトリ。C:\Users\user などになる。
$LastExitCode 終了コード
$Matches -match, -notmatch の結果
$NULL Null
$OFS
$PID プロセスID
$Profile PowerShellのプロファイルへのパス
$PsHome PowerShell の場所。 C:\Windows\System32\WindowsPowerShell\v1.0 など
$Pwd カレントディレクトリ
$Sender イベントの発生元
$ShellID "Microsoft.PowerShell"
$StackTrace 例外発生時のスタックトレース
$This Me, this
$True True

[Top]


 環境変数

環境変数は env:名前 の形式でアクセスできます。ここで "env:" はドライブ名のような感じで使用します。環境変数一覧は Get-ChildItem コマンドレットを使って取得できます。

PS C:\> get-childitem env:*

Name                           Value
----                           -----
COMPUTERNAME                   DELL
USERPROFILE                    C:\Users\user
HOMEPATH                       \Users\user
  (以下略)

特定の環境変数の内容取得は下記のようにして行います。$env: のように $ を付けることに注意してください。$ がないと文字列とみなされます。

PS C:\> echo $env:SystemDrive
C:

[Top]


 参照

関数のパラメータは通常は「値渡し」ですが「参照渡し」にすることも可能です。参照渡しにすると関数内でそのパラメータの値ウィ変更すると、関数からもどったときの元の変数の値が変更されます。参照渡しにする場合は、[ref] をパラメータの前に付けます。また、値を使う場合は value プロパティを使用します。

function reftest([ref]$x) {
  $x.value++
}

$x = 1
reftest ([ref]$x)
$x

実行例

PS C:\> .\ref.ps1
2

[Top]


 型の変換

変数に代入した値を型変換する方法ですが、次の例のように [type] でキャストすることで変換できます。

PS C:\> $x = "12.3"
PS C:\> $x.gettype()

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

PS C:\> $x = [float]$x
PS C:\> $x.gettype()

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

.NET Framework の各種メソッドも使用可能です。次の例は、浮動小数点数を ToString() メソッドを使って文字列に変換しています。

PS C:\> $x = 98.7
PS C:\> $x.gettype()

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

PS C:\> $x = $x.ToString()
PS C:\> $x
98.7
PS C:\> $x.gettype()

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

次の例のように System.Convert クラスのメソッドを利用することもできます。この例で使っている ToInt16() はスタティックなメソッドなので :: を使って参照することに注意してください。

PS C:\> $i = 128
PS C:\> $i.gettype()

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

PS C:\> $j = [System.Convert]::ToInt16($i)
PS C:\> $j
128
PS C:\> $j.gettype()

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

[Top]


 

 制御構文

break 文

break 文の書き方は C# と同じで機能も同じです。

$i = 0
while (1) {
  if ($i -gt 100) {
    break
  }
  echo $i
  $i++
}

実行例

PS C:\> .\break.ps1
0
1
2
  (途中略)
100

[Top]


continue 文

continue 文の書き方は C# と同じで機能も同じです。

$i = 0
while (1) {
  if ($i -lt 10) {
    echo $i
    $i++
    continue  # $i が 10 より小さい間は continue
  }
  break  # 10 以上なら break
}

実行例

PS C:\> .\continue.ps1
0
1
2
3
4
5
6
7
8
9

[Top]


do 文

do 文の書き方は C# と同じで機能も同じです。

$i = 5
do {
  $i--
  echo $i
} while ($i -gt 0)  # $i > 0 の間繰り返す。
 

実行例

PS C:\> .\do.ps1
4
3
2
1
0

[Top]


for 文

for 文の書き方は C# と同じで機能も同じです。

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

実行例

PS C:\< .\for.ps1
0
1
2
3
4

[Top]


foreach 文

foreach 文の書き方は C# と同じで機能も同じです。

$weekday = "mon", "tue", "wed", "thu", "fri"

foreach ($day in $weekday) {
  echo $day
}

実行例

PS C:\> .\foreach.ps1
mon
tue
wed
thu
fri

[Top]


if 文

if 文の書式は下の通りです。

if (<test1>) 
  {<statement list 1>}
[elseif (<test2>)
  {<statement list 2>}]
[else
  {<statement list 3>}]

サンプル

PS C:\> if ($_ -eq $null) { write-host null }
null

[Top]


return 文

return 文は関数などから戻るときに使います。PowerShell では return を省略することも可能です。その場合、最後に得られた値が戻り値となります。

function getfiles {
  param($p)
  echo $p
  return get-childitem $p  # この return は省略可能。
}
 
$f = getfiles c:\bin
foreach ($i in $f) {
  echo $i
}

[Top]


switch 文

switch 文 は C# のものと似ていますが、少し違います。

$ss = "powershell", "POWERSHELL", "PowerShell", "powerShell"

foreach ($s in $ss) {
  switch -casesensitive ($s) {
    "powershell" { echo "全部小文字" }
    "POWERSHELL" { echo "全部大文字" }
    "PowerShell" { echo "語の先頭が大文字" }
    default { echo "Default" }
  }
}

実行例

PS C:\> .\switch.ps1
全部小文字
全部大文字
語の先頭が大文字
Default

[Top]


throw 文

throw 文は例外を発生させます。throw の後に式を付け加えることができます。

try {
  throw
  echo "Thrown."
}
catch {
  "Catched!!"
}

実行例

PS C:\> .\throw.ps1
Catched!!

[Top]


try - catch - finally 文

try - catch - finally 文は例外が発生する可能性がある文で、例外が発生した場合の処理を行うのに使います。

try {
  $obj = $Null
  $obj.ToString()
  "End Try"
}
catch {
  "Exception"
}
finally {
  "Finally"
}

実行例

PS C:\> try_catch.ps1
Exception
Finally

[Top]


while 文

while 文は C# のものとほぼ同じです。

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

実行例

PS C:\> .\while.ps1
1
2
3
4
5

[Top]


 オブジェクト

New-Object

オブジェクトの構築は New-Object コマンドレットで行います。構文を下に示します。

New-Object [-TypeName] <String> [[-ArgumentList] <Object[]>] [-Property <IDictionary>] [<CommonParameters>]
New-Object [-ComObject] <String> [-Property <IDictionary>] [-Strict] [<CommonParameters>]

サンプル1

下のサンプルは、System.IO.FileInfo クラスをインスタンス化して、パラメータで与えたファイル情報を得るものです。

# FileInfo
$fi = New-Object System.IO.FileInfo c:\windows\notepad.exe
echo $fi.Length
echo $fi.DirectoryName
echo $fi.Name
echo $fi.Extension

実行例

PS C:\> .\fileinfo.ps1 221184 c:\windows notepad.exe .exe

[Top]


サンプル2

下のサンプルは System.Text.StringBuilder を構築して文字列を連結するものです。Append() メソッドを使う場合、このメソッドが返す値 (StringBuilder) が表示されます。それを避けるため、> $Null を使用しています。

$sb = New-Object -TypeName System.Text.StringBuilder
$sb.Append("1234") > $Null
$sb.Append("-") > $Null
$sb.Append("0987") > $Null
$sb.ToString()

実行例

PS C:\> .\stringbuilder.ps1 1234-0987

[Top]


サンプル3

次のサンプルは -ComObject を使って COM オブジェクトを構築する例です。

$y = New-Object -ComObject Scripting.Dictionary
$y.add("One", "Ichi")
$y.add("Two", "Ni")
$y.add("Three", "San")
echo $y.Item("Three")
echo $y.Item("Two")

実行例

PS C:\> .\comobject.ps1
San
Ni

[Top]


ForEach-Object

ForEach-Object コマンドレットはコレクションの要素ごとに繰り返し処理を行うのに使います。

PS C:\> $a = "a","bc","ccc"
PS C:\> $a | foreach-object { $_.Length }
1
2
3

次に ForEach-Object コマンドレットの構文を示します。

ForEach-Object [-Process] <ScriptBlock[]> [-Begin <ScriptBlock>] [-End <ScriptBlock>] [-InputObject <PSObject>] [-RemainingScripts <ScriptBlock[]>] [-Confirm] [-WhatIf] [<CommonParameters>]

[Top]


Group-Object

Group-Object コマンドレットは、オブジェクトのコレクションをグループ化します。下に使用例を示します。

PS C:\> $list = 10,5,5,6,10,8,11,14
PS C:\> $list | group-object

Count Name                      Group
----- ----                      -----
    2 10                        {10, 10}
    2 5                         {5, 5}
    1 6                         {6}
    1 8                         {8}
    1 11                        {11}
    1 14                        {14}

次に Group-Object コマンドレットの構文を示します。

Group-Object [[-Property] <Object[]>] [-AsHashTable] [-AsString] [-CaseSensitive] [-Culture <String>] [-InputObject <PSObject>] [-NoElement] [<CommonParameters>]

[Top]


Where-Object

Where-Object コマンドレットは、コレクションの要素のプロパティに対してフィルタをかけるのに使用します。下に使用例を示します。


PS C:\> dir | where-object { $_.Length -lt 50 }

    ディレクトリ: C:\workspace\Misc\PowerShell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2015/04/28      8:47         46 for.ps1
-a---        2010/05/06     11:05         49 mssql.ps1
-a---        2015/04/21     20:39         40 temp.txt
-a---        2015/04/28     19:43         45 while.ps1

次に Where-Object コマンドレットの構文を示します。

[Top]


Compare-Object

Compare-Object コマンドレットは2つのオブジェクトを比較します。

PS C:\> $x=0
PS C:\> $y=1
PS C:\> compare-object $x $y

  InputObject SideIndicator
  ----------- -------------
            1 =>
            0 <=

構文

Compare-Object [-ReferenceObject] <PSObject[]> [-DifferenceObject] <PSObject[]> [-CaseSensitive] [-Culture <String>] [-ExcludeDifferent] [-IncludeEqual] [-PassThru] [-Property <Object[]>] [-SyncWindow <Int32>] [<CommonParameters>]

[Top]


Select-Object

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

PS C:\> $a = 10,1,1,2,5,3,3,2,1
PS C:\> $a | select-object -unique
10
1
2
5
3

構文

Select-Object [[-Property] <Object[]>] [-ExcludeProperty <String[]>] [-ExpandProperty <String>] [-First <Int32>] [-InputObject <PSObject>] [-Last <Int32>] [-Skip <Int32>] [-Unique] [-Wait] [<CommonParameters>]

[Top]


Sort-Object

Sort-Object コマンドレットはプロパティ値別にオブジェクトを並べ替えます。

PS C:\> get-childitem c:\windows\*.exe | sort-object $_.name


    ディレクトリ: C:\windows


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/08/22     20:21      56832 bfsvc.exe
-a---        2015/01/28      8:47    2501368 explorer.exe
-a---        2014/10/29     10:46    1001472 HelpPane.exe
-a---        2014/10/29     11:43      17408 hh.exe
-a---        2014/10/29     11:16     221184 notepad.exe
-a---        2014/10/29     11:12     154624 regedit.exe
-a---        2014/10/29     11:19     128512 splwow64.exe
-a---        2014/10/29     10:53       9728 winhlp32.exe
-a---        2014/10/29     11:34      11264 write.exe

構文

Sort-Object [[-Property] <Object[]>] [-CaseSensitive] [-Culture <String>] [-Descending] [-InputObject <PSObject>] [-Unique] [<CommonParameters>]

[Top]


Tee-Object

Tee-Object コマンドレットはファイルまたは変数にコマンドの出力を保存し、またそれをパイプラインに送信します。下のサンプルではファイル一覧を表示しつつファイルにも保存しています。

PS C:\> get-childitem c:\windows\*.exe | tee-object -filepath file1.txt

    ディレクトリ: C:\windows


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/08/22     20:21      56832 bfsvc.exe
-a---        2015/01/28      8:47    2501368 explorer.exe
-a---        2014/10/29     10:46    1001472 HelpPane.exe
-a---        2014/10/29     11:43      17408 hh.exe
-a---        2014/10/29     11:16     221184 notepad.exe
-a---        2014/10/29     11:12     154624 regedit.exe
-a---        2014/10/29     11:19     128512 splwow64.exe
-a---        2014/10/29     10:53       9728 winhlp32.exe
-a---        2014/10/29     11:34      11264 write.exe
PS C:\> get-content file1.txt

    ディレクトリ: C:\windows


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/08/22     20:21      56832 bfsvc.exe
-a---        2015/01/28      8:47    2501368 explorer.exe
-a---        2014/10/29     10:46    1001472 HelpPane.exe
-a---        2014/10/29     11:43      17408 hh.exe
-a---        2014/10/29     11:16     221184 notepad.exe
-a---        2014/10/29     11:12     154624 regedit.exe
-a---        2014/10/29     11:19     128512 splwow64.exe
-a---        2014/10/29     10:53       9728 winhlp32.exe
-a---        2014/10/29     11:34      11264 write.exe

構文

Tee-Object [-FilePath] <String> [-Append] [-InputObject <PSObject>] [<CommonParameters>]
Tee-Object [-InputObject <PSObject>] -LiteralPath <String> [<CommonParameters>]
Tee-Object [-InputObject <PSObject>] -Variable <String> [<CommonParameters>]

[Top]


Measure-Object

Measure-Object コマンドレットはオブジェクトの数値プロパティと、テキストのファイルなど文字列オブジェクト内の文字、単語、および行を計算します。

PS C:\> $a = 5,10,8,12
PS C:\> $a | measure-object -average -sum -minimum -maximum

Count    : 4
Average  : 8.75
Sum      : 35
Maximum  : 12
Minimum  : 5
Property :

構文

Measure-Object [[-Property] <String[]>] [-Average] [-InputObject <PSObject>] [-Maximum] [-Minimum] [-Sum] [<CommonParameters>]

Measure-Object [[-Property] <String[]>] [-Character] [-IgnoreWhiteSpace] [-InputObject <PSObject>] [-Line] [-Word][<CommonParameters>]

[Top]


 

 演算子

算術演算子

算術演算子には +, -, *, /, % があります。

(参考) Write-Host などのパラメータで演算子を使っても期待した通りの結果は得られません。

PS C:\> write-host 10+20
10+20

+ は文字列に対して使用できます。

PS C:\> $s = "abc" + "-" + "0123"
PS C:\> echo $s
abc-0123  br

[Top]


代入演算子

代入演算子には =, +=, -=, *=, /=, %= があります。


比較演算子

比較演算子には -eq, -ne, -gt, -lt, -ge, -le があります。==, !=, > などではないので注意が必要です。

使用例

for ($i = 0; $i -lt 10; $i += 2) {
  echo $i
}

正規表現で使用される演算子も比較演算子の一部であり、以下のものがあります。

使用例はこちら

[Top]


論理演算子

論理演算子には -and, -or, xor, -not, ! があります。

使用例

$x = $true
$y = $true
$result = $x -and $y
echo $result

$x = $false
$result = $x -and $y
echo $result

$result = $x -or $y
echo $result

$result = -not $y
echo $result

実行例

PS C:\> .\logical_op.ps1
True
False
True
False

[Top]


ビット演算子

ビット演算子には -bAND, -bOR, -bXOR, -bNOT があります。

PS C:\> 0xff -bAnd 0x80
128

リダイレクト演算子

リダイレクト演算子には >, >>, 2> があります。(※ < はありません)


Split と Join

-split と -join は文字列を分割と結合します。

-split の使用例

PS C:\> $s = "10,30,55,23"
PS C:\> $ss = $s -split ","
PS C:\> echo $ss
10
30
55
23

-join の使用例

PS C:\> write-host $ss
10 30 55 23
PS C:\> $s2 = $ss -join "+"
PS C:\> echo $s2
10+30+55+23

[Top]


Type 演算子

Type 演算子には -is, -isnot, -as があります。

-is 演算子の使用例

PS C:\> $y = $s -is "System.String"
PS C:\> echo $y
True
PS C:\> $y = $s -is "System.Int32"
PS C:\> echo $y
False

-as 演算子の使用例

PS C:\> $dt = "2015/01/15"
PS C:\> $dt.GetType()

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

PS C:\> $dt = $dt -as [DateTime]
PS C:\> $dt.GetType()

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

[Top]


単項演算子

単項演算子には、-, ++, -- があります。

- の使用例

PS C:\> $i = 5
PS C:\> $ii = -$i
PS C:\> $ii
-5

++ 演算子の使用例

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

[Top]


特殊演算子


@( ) 演算子

この演算子はカッコ内で定義した1個以上の PowerShell ステートメントを配列として返す。

使用例

PS C:\> $stats = @(get-childitem c:\windows)
PS C:\> echo $stats

    ディレクトリ: C:\windows

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2013/08/23      0:36            addins
d----        2013/08/23      0:36            ADFS
d----        2015/04/18     16:39            AppCompat
  (以下略)
PS C:\> $stats.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

[Top]


& (Call operator)

& 演算子を使うと文字列として定義したコマンドを実行することができる。

使用例

PS C:\> $cmd = "Get-Process"
PS C:\> & $cmd

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    381      21    10016      18716   114     0.20   4840 AAM Updates Notifier
     76       8     1228       4928    76     0.00   4648 ActivateDesktop
     94       7     1512       5132    57            2276 AdminService
  (以下略)

[Top]


[ ] 演算子 (Cast)

[ ] の中に「型」を書くことにより変数のキャスト(型変換)を行うことができる。

使用例

PS C:\> $i = 0
PS C:\> $i.GetType()

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

PS C:\> $s = [String] $i
PS C:\> $s.GetType()

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

[Top]


, (Comma) 演算子

, 演算子は配列を作るのに使用する。1個の要素からなる配列を作るときはリストの先頭に , を付ける。

PS C:\> $a = 1,2,3,4
PS C:\> write-host $a
1 2 3 4
PS C:\> $a = ,100
PS C:\> write-host $a
100
PS C:\> $a.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

[Top]


. (dot) 演算子

. 演算子は現在のスコープで実行するスクリプトが内部で定義した定義された変数、関数、エイリアスなどを現在のスコープに引き継げるようにする。

次のサンプルは コマンド引数および現在のスコープで定義した $xx という変数、スクリプト内で定義した $xy という変数を表示している。

スクリプトの内容

PS C:\> cat c:\temp\script.ps1
$x = $Args[0]
echo $x
echo $xx
$xy = $xx
$xx = -1

実行例

PS C:\> $xx = 99999
PS C:\> . test\script.ps1 129
129
99999
PS C:\> echo $xy
99999
PS C:\> echo $xx
-1

[Top]


-f 演算子

-f 演算子はオブジェクトを表示するときのフォーマットを指定するのに使用する。

使用例

PS C:\> "{0:0#####}" -f 678
000678
PS C:\> "{0:G} {1:x}" -f 12.5e-1, 1024
1.25 400

[Top]


[ ] (Index) 演算子

[ ] 演算子は配列等の要素を指定するのに使用する。下に使用例を示す。

PS C:\> $a = 5,6,7,8
PS C:\> $a[1]
6
PS C:\> $h = @{"a"=100; "b"=101; "c"=202}
PS C:\> $h["b"]
101

[Top]


| 演算子

| 演算子はパイプラインでコマンドレットを接続するのに使用する。

使用例

PS C:\> $a = 5,6,7,8
PS C:\> $a | foreach-object { $_ * 10 }
50
60
70
80

[Top]


. 演算子

. 演算子はオブジェクトのプロパティやメソッドを指定するのに使用する。下のサンプルは文字列の長さを Length プロパティで取得している。

PS C:\> "xxxxxx".Length
6

[Top]


.. 演算子

.. 演算子は「レンジ」を定義するのに使用する。.. 演算子で配列を定義しその内容を表示している。

PS C:\> $a = 1 .. 10
PS C:\> foreach ($x in $a) { $x }
1
2
3
4
5
6
7
8
9
10

[Top]


:: 演算子

:: 演算子はクラスのスタティックなメンバを指定するのに使用する。

使用例

PS C:\> [datetime]::Now

2015年4月30日 12:00:00

[Top]


$( ) 演算子

$( ) 演算子はステートメントの結果を返す。ステートメントが複数ある場合は結果は配列となる。

PS C:\> $result = $($x+5;$x+1)
PS C:\> $result
9
5
PS C:\> $result.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

[Top]


 関数

構文

関数は以下の構文を持ちます。

function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])]  
{
   param([type]$parameter1 [,[type]$parameter2])
   dynamicparam {<statement list>}
   begin {<statement list>}
   process {<statement list>}
   end {<statement list>}
}

[Top]


サンプル

サンプル1

# 関数の使用
function getfiles {
  param($p)  # サンプル2のように書いてもよい。
  echo $p
  return get-childitem $p
}

$f = getfiles c:\bin
foreach ($i in $f) {
  echo $i
}

[Top]


サンプル2

function root([double] $x) {
  if ($x -lt 0.0) {
    return -1.0
  }
  $y = [System.Math]::sqrt($x)
  return $y
}

$y = root(2)
echo $y
$y = root(-1)
echo $y

[Top]


サンプル3

複数の引数がある場合、呼び出し側では引数をカンマでなく空白で区切ります。

function distance([double]$x, [double]$y) {
  [System.Math]::sqrt($x * $x + $y * $y)
}

$y = distance 1.0 1.0
$y

[Top]


サンプル4

begin, end を持つ関数の例です。

function withbe {
  begin { "begin loop" }
  process {
     echo $_
  }
  end { "loop end" }
}

# テスト実施
"パラメータなし"
withbe
"パラメータあり"
$a = 1,2,3
$a | withbe

実行例

パラメータなし
begin loop
loop end
パラメータあり
begin loop
1
2
3
loop end

[Top]


サンプル5

dynamicparam を持つ関数の例です。

function dynp {
   [CmdletBinding()]
   param(
    [Parameter(
      Mandatory=$false,
      Position=1,
      HelpMessage="double value"
    )]
    [double]$x
  )
  dynamicparam {
    if ($x -eq $null) {
      $x = -1
    }
    elseif ($x -gt 100) {
      $x = 100
    }
  }
  process {
    return $x * 10
  }
}   

$y = dynp 3.5e5
$y
$y = dynp 5
$y
$y = dynp $null
$y
$y = dynp
$y

実行例

1000
50
-10
0

[Top]


 

 正規表現

-match, -notmatch 演算子

-match 演算子を使うとある文字列に正規表現に一致する部分文字列があるかどうかをブール値で返します。-notmatch 演算子は -match の逆の動作を行います。

PS C:\> "Windows PowerShell" -match "windows"
True
PS C:\> "Windows PowerShell" -match "Bool"
False
PS C:\> "Windows PowerShell" -match "^in"
False
PS C:\> "Windows PowerShell" -match "^Win"
True
PS C:\> "Windows PowerShell" -notmatch "^Win"
False

[Top]


-replace 演算子

-replace 演算子は一致した部分文字列を他の文字列で置き換えます。置き換える文字列を省略した場合は、その部分文字列は削除されます。下の例では母音をアスタリスクに置き換えています。

PS C:\> "Windows PowerShell" -replace "[a,e,i,o,u]", "*"
W*nd*ws P*w*rSh*ll
PS C:\>

-like, -notlike 演算子

-like, -notlike 演算子を使うと文字列のあいまい検索ができます。

PS C:\> "Windows PowerShell" -like "*Power*"
True
PS C:\> "Windows PowerShell" -like "*Power"
False

[Top]


-in, -notin 演算子と -contains, -notcontains 演算子

-in 演算子は SQL の IN 演算子に近い動作をします。つまり、ある文字列が文字列配列に含まれているかをチェックしてもしそうなら True を返します。-notin 演算子は逆に False を返します。

-contains 演算子は配列にある文字列が含まれていれば True を返します。

PS C:\> $a
Active
Content
On
PS C:\> $a -in "On"
False
PS C:\> $a -contains "On"
True
PS C:\> "On" -in $a
True

[Top]


Regex

.NET CLR の Regex クラスを使うことも可能です。

PS C:\> [Regex]::IsMatch("0101", "!\d+")
False
PS C:\> [Regex]::IsMatch("0101", "\d+\.\d+")
False

[Top]


コメント

PowerShell のコメントは1行コメントと複数行コメントがあります。

# これは1行コメントです。
<#
  これは複数行コメントです。
#>

[Top]


データセクション

データセクションはデータだけを有するブロックです。データセクションの先頭は Data (DATA, data でもよい) で始まります。データセクションの中にはリテラルだけでなく演算子やコマンドレットも書くことができます(制限はある)。

サンプル

# Data Section
$d1 = Data {
  "data1"
  "data2"
  "data3"
}

$d1[1]
# ConvertFrom-StringData コマンドレットの使用例
$d2 = Data {
  ConvertFrom-StringData -stringdata @'
    key1 = Value1
    key2 = Value2
'@
}

$d2["key1"]

実行例

PS C:\> .\data.ps1
data2
Value1

[Top]


例外処理

PowerShell では C# と同じような文法で例外処理をサポートしています。下にサンプルを示します。例外が発生したときの例外オブジェクトは、$_ で取得できるほか、$error[] で例外の履歴も取得できます。その場合、最後に発生した例外が $error[0] です。

PowerShell では例外のレベルがあり、デフォルトではすべての例外が try catch ブロックで取得できるわけではありません。すべての例外をキャッチするには $ErrorActionPreference = "Stop" を設定します。

# すべての例外をキャッチできるようにする。これがないとキャッチしない例外がある。
$ErrorActionPreference = "Stop"

try {
 Ge-Content C:\temp\text1.txt  # Get でなく Ge になっている。
}
catch {
 write-host "**************** 例外を検出。*********************"
 write-host $_  # $error[0]でも同じ
}
finally {
 "***************** finally も使える。*********************"
}

例外をキャッチする手段としては、try catch の他、trap も使用できます。

# trap のテスト
trap {
 "******* 例外が発生 *******"
  continue  # break にするとここで中断する。
}
# Get でなく Ge になっているので例外が発生する。
Ge-Content c:\test.txt
"OK"

Begin / Process / End ブロック

PowerShell の関数には Begin, Process, End のブロックがあります。Begin, End はオプションなので、なくてもかまいません。その場合、Process は特に書く必要はありません。以下にその機能を示します。

サンプル

# begin process end ブロック
function block($n) {
 begin { "Start" }
 process {
  foreach ($i in 0 .. $n) {
     $i
  }
 }
 end { "End" }
}

block 10