source

PowerShell - "Write-Output" vs "return" 함수

manysource 2023. 9. 7. 21:48

PowerShell - "Write-Output" vs "return" 함수

저는 몇 년 동안 파워쉘을 사용해 왔는데, 좀 더 '이심한' 행동에 대해 잘 알고 있다고 생각했습니다만, 제가 이해할 수 없는 문제에 부딪혔습니다.

항상 함수에서 값을 반환할 때 "반환"을 사용해 왔지만 최근에는 Write-Output을 대안으로 생각했습니다.하지만 PowerShell이 PowerShell인 저는 (적어도 저에게는) 말이 안 되는 것을 발견했습니다.

function Invoke-X{ write-output @{ "aaa" = "bbb" } };
function Invoke-Y{ return @{ "aaa" = "bbb" } };

$x = Invoke-X;
$y = Invoke-Y;

write-host $x.GetType().FullName
write-host $y.GetType().FullName

write-host ($x -is [hashtable])
write-host ($y -is [hashtable])

write-host ($x -is [pscustomobject])
write-host ($y -is [pscustomobject])

출력:

System.Collections.Hashtable
System.Collections.Hashtable
True
True
True
False

$x와 $y(또는 '쓰기-출력'과 '반환')의 차이는 무엇입니까? 둘 다 해시 테이블이지만 둘 중 하나만 '-' 사용자 지정 개체라는 뜻입니까?그리고 변수에 있는 모든 해시 테이블이 pscustom 개체인지 명확하게 확인하는 것 외에 코드와의 차이를 결정할 수 있는 일반화된 방법이 있습니까?

이 동작이 특정 버전의 PowerShell과 관련된 경우 $PSVersionTable은 다음과 같습니다.

Name                           Value
----                           -----
PSVersion                      5.1.16299.492
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.492
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

건배.

M

return그리고.[pscustomobject]어떻게 보면 여기 빨간 청어가 있습니다.

결론은 다음과 같습니다.

  • 암시적 표현 출력 대 cmdlet 생성 출력, 사용return(호출 는 (cmdlet출이다에전 )를 범주에Write-Output

  • 출력 개체가 래핑됨 - 대부분 보이지 않음 -[psobject]cmdlet 생산 출력에서만 인스턴스를 생성할 수 있습니다.

# Expression output: NO [psobject] wrapper:
@{ "aaa" = "bbb" } -is [psobject] # -> $False

# Cmdlet-produced output: [psobject]-wrapped
(Write-Output @{ "aaa" = "bbb" }) -is [psobject]  # -> $True

도 - 하세요 - 도 - -[pscustomobject] .[psobject]다: 를 를 .[System.Management.Automation.PSObject], 일반적으로 보이지 않는 도우미 유형으로 PowerShell이 뒤에서 사용합니다.
(혼란을 가중시키기 위해 별도의[System.Management.Automation.PSCustomObject]활자로 입력합니다.)

대부분 이 여분의 것은.[psobject]래퍼는 양성입니다. 대부분 랩핑된 개체가 직접적으로 동작하는 것처럼 동작하지만 미묘하게 다른 동작을 일으키는 경우도 있습니다(아래 참조).


그리고 변수에 있는 모든 해시 테이블이 pscustom 개체인지 명확하게 확인하는 것 외에 코드와의 차이를 결정할 수 있는 일반화된 방법이 있습니까?

해시 테이블은 PS 사용자 지정 개체가 아닙니다. 이 개체는 - any - 에 대해서만 나타납니다.[psobject] 됨 로 인해 - object가 발생합니다.[pscustomobject][psobject].

지정 개체를 하려면 - 을 PS 를 하는 하여 하는 를 을 하여 [pscustomobject] @{ ... }아니면New-Object PSCustomObject/New-Object PSObject는은과에해다d에s다해hmyrsd는과은m>Select-Object그리고.Import-Csv- 용도:

$obj -is [System.Management.Automation.PSCustomObject] # NOT just [pscustomobject]!

주의할 점은 관련된 것을 사용하는 것입니다.-asWindows PowerShell v5.1 / PowerShell Core v6.1.0에서 실제 PS 사용자 지정 개체가 있는 운영자가 손상되었습니다. 아래 참조.

예를 들어 여분의 물건이[psobject]포장지는 양성이지만 포장된 개체라도 해당 유형을 직접 테스트할 수 있습니다.

(Write-Output @{ "aaa" = "bbb" }) -is [hashtable]  # $True

즉, 포장지에도 불구하고,-is여전히 랩핑된 유형을 인식합니다.따라서 다소 역설적이게도 둘 다 -is [psobject]그리고.-is [hashtable]돌아가다$True이 경우, 이 유형들은 관련이 없음에도 불구하고.


이러한 차이에 대해 합당한 이유가 없으며, 내부 구조물이 커튼 뒤에서 우연히 엿보고 있는 것과 같은 유출된 추상화(구현물)라는 인상을 줍니다.

다음 GitHub 문제에서는 이러한 동작에 대해 설명합니다.

추가하는 것도 참고하세요.Write-Output디버그 메시지는 .net과 달리 반환 유형을 배열로 변경합니다.쓰기 라인을 추가하면 기능이 중단될 수 있습니다.

function Invoke-X {
    $o1 = [pscustomobject] @{ foo = 1, 2 }
    return $o1
}

function Invoke-Y {

    $o1 = [pscustomobject] @{ foo = 1, 2 }
    Write-Output "Debug messageY"
    return $o1
 }

function Invoke-Z {
    $o1 = [pscustomobject] @{ foo = 1, 2 }
    Write-Output "Debug messageZ"
    return ,$o1
 }

$x = Invoke-X;
$y = Invoke-Y;
$z = Invoke-Z;

Write-Host
Write-Host "X  Type: " $x.GetType().FullName $x.foo
Write-Host
Write-Host "Y  Type: " $y.GetType().FullName
Write-Host "Y0 Type: " $y[0].GetType().FullName $y[0]
Write-Host "Y1 Type: " $y[1].GetType().FullName $y[1].foo
Write-Host
Write-Host "Z  Type: " $z.GetType().FullName
Write-Host "Z0 Type: " $z[0].GetType().FullName $z[0]
Write-Host "Z1 Type: " $z[1].GetType().FullName $z[1].foo

제공:

X 유형: 시스템.관리.자동화.PS 사용자 지정 개체 12Y 유형: 시스템.개체[]Y0 유형: 시스템.문자열 디버그 메시지yY1 유형: 시스템.관리.자동화.PS 사용자 지정 개체 12Z 타입: 시스템.개체[]Z0 타입: 시스템.문자열 디버그 메시지ZZ1 유형: 시스템.관리.자동화.PS 사용자 지정 개체 12

언급URL : https://stackoverflow.com/questions/51177881/powershell-write-output-vs-return-in-functions