PowerShell 로 다음과 같은 코드를 실행하면 어떤 값이 나올까?

# 샘플 1
function f1
{
    $a = New-Object System.Collections.ArrayList
    $a.Add(1)
    $a.Add(2)
    return $a
}

$ret = f
$ret.getType().fullname
$ret

ArrayList를 return 했으니 다음과 같이 나올 것이라고 기대했다.

System.Collections.ArrayList
1
2

하지만 실제 나오는 값은 다음과 같다.

System.Object[]
0
1
1
2

알고 보니 powershell 의 return 은 생각하던 것과 다르게 동작하고 있었다.
다음 코드는

return $a

사실 다음과 같이 동작한다는 것

$a
return

그리고 return으로 넘어오는 값은 중간에 output으로 내보낸 값이 다 넘어 오더라는

# 샘플 2
function f2
{
$a = 1
$b = 2
$c = 3
$a
$b
$c
return $c
}

$ret = f2
$ret.getType().fullname
$ret

# 결과
System.Object[]
1
2
3
3

위와 같이 $a, $b, $c, $c 식으로 output으로 나간 결과가 return 되어서 처리되더라능 :(

샘플 1의 문제가 되는 부분은
System.Collections.ArrayList.Add 이 value가 add된 index를 return 해서 문제였다능.

Object 그대로 return 되기를 원한다면 다음과 같이 수정하면 되는 듯

# 샘플 1 수정
function f1
{
    $a = New-Object System.Collections.ArrayList
    [void]$a.Add(1) # ouput 제거
    [void]$a.Add(2) # output 제거
    ,$a # Object 그대로 return 하도록
}

$ret = f
$ret.getType().fullname
$ret

# 결과
System.Collections.ArrayList
1
2

[ 참고 ]

Effective PowerShell Item 7: Understanding "Output"
Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My!



728x90

+ Recent posts