トッカンソフトウェア

PowerShell 関数

PowerShellの関数をまとめます。

関数

関数を定義するには function 関数名(引数) の形で定義します。
関数に渡す引数が複数ある場合は、スペースで区切ります。
				
function Test($a, $b){
    return $a + $b
}

$c = Test 1 2
Write-Output $c

			
3が出力されます。

ちなみにクラスのスタティックメソッドやオブジェクトのメソッドを呼び出す場合は、カッコを付けてカンマで区切ります。
				
$obj.Test(1, 2)
[Class]::Test(1, 2)

			

関数の外の変数にアクセス

関数の外の変数にアクセスするには変数に $script: を付けます。
				
function Test($a, $b){
    $script:c =  $a + $b
}

$c = 1
Test 2 3
Write-Output $c


			
5が出力されます。

同じ名前の変数で関数から外の変数にアクセスできますが、"$c = "で関数内に新たな$c変数が作成されるため、 関数内、外で2つの$cが作成されます。

function Test($a, $b){
    Write-Output ("before c:" + $c) # → 1
    Write-Output ("before script:c:" + $script:c) # → 1
    $c =  $a + $b # 新たに$c変数が作成される
    Write-Output ("after c:" + $c) # → 5(関数内の$c)
    Write-Output ("after script:c:" + $script:c) # → 1(関数外の$c)
}

$c = 1
Test 2 3
Write-Output ("result:" + $c)

出力

before c:1
before script:c:1
after c:5
after script:c:1
result:1


$script:を付けることで新たに変数の作成を防ぎます。

function Test($a, $b){
    Write-Output ("before c:" + $c) # → 1
    Write-Output ("before script:c:" + $script:c) # → 1
    $script:c =  $a + $b # 関数外の$cにアクセス
    Write-Output ("after c:" + $c) # → 5
    Write-Output ("after script:c:" + $script:c) # → 5
}

$c = 1
Test 2 3
Write-Output ("result:" + $c)

出力

before c:1
before script:c:1
after c:5
after script:c:5
result:5


リストやマップも=で新たなオブジェクトを作成しなければ関数外のオブジェクトを操作できます。
$ary += 30 の場合、$ary = $ary +30 なので、新たなオブジェクトが作成されてしまいます。

function Test(){
    $list.Add(3)
    $ary += 30
    $map.Add("c", 300)
}

$list = New-Object System.Collections.Generic.List[int]
$list.Add(1)
$list.Add(2)

$ary = @(10, 20)

$map = @{a=100;b=200}

Test
Write-Output $list
Write-Output $ary
Write-Output $map


出力

1
2
3
10
20

Name                           Value                                                                                                                          
----                           -----                                                                                                                          
c                              300                                                                                                                            
a                              100                                                                                                                            
b                              200                                                                                                                            


別ファイルに関数を定義

別ファイルに定義した関数を呼び出すには、頭にドットを付けて別ファイルを記述することで参照できます。

C:\work\test.ps1 の中身。
				
function Test($a, $b){
    $script:c =  $a + $b
}


			
頭にドットを付けてtest.ps1を参照。
				
. "C:\work\test.ps1"

$c = 1
Test 2 3
Write-Output $c


			
5が出力されます。

参照渡し

引数に[ref]を付けると参照渡しができます。.valueで参照元にアクセスできます。
				
function Test([ref]$x,[ref]$y){
    $x.value = 2
    $y.value = 3
}

$a = 1
$b = 1
Test([ref]$a)([ref]$b)
Write-Output ($a + $b)


			
5が出力されます。

引数なし

引数なしはカッコをつけません。

function Test{
    Write-Output "Hello World"
}

Test

Hello Worldが出力されます。


ページのトップへ戻る