IT

LINQ SelectMany 메서드와 동등한 PowerShell

itgroup 2023. 10. 5. 21:31
반응형

LINQ SelectMany 메서드와 동등한 PowerShell

루프백 주소를 제외한 모든 로컬 IPv4 주소를 얻기 위해 PowerShell 코드를 작성하고 있습니다.저는 LINQ Select Many와 같은 방법이 필요한데 PS 필터로 어떻게 해야 하는지 모르겠어요.이것은 지금까지 제가 가지고 있는 코드이며, 일반적인 오래된 ArrayList를 사용하여 작동합니다.

function Get-Computer-IP-Address()
{
    $ipAddresses = New-Object System.Collections.ArrayList

    $networkAdaptersWithIp = Get-WmiObject Win32_NetworkAdapterConfiguration | ? { $_.IPAddress -ne $null }
    foreach ($networkAdapter in $networkAdaptersWithIp)
    {
        foreach ($ipAddress in $networkAdapter.IPAddress)
        {
            if ($ipAddress -notlike "127.*" -and $ipAddress -notlike "*::*")
            {
                $ipAddresses.Add($ipAddress)
            }
        }
    }

    if ($ipAddresses.Length -eq 0)
    {
        throw "Failed to find any non-loopback IPv4 addresses"
    }

    return $ipAddresses
}

코드가 적은 좀 더 깨끗한 방법이 있는지 알고 싶습니다.

"PowerShell equivalent of LINQ SelectMany method"라는 제목의 질문에 대답하기만 하면 됩니다.

collection.SelectMany(el => el.GetChildren()) // SelectMany in C#

와 동치입니다.

$collection | % { $_ }                    # SelectMany in PowerShell for array of arrays
$collection | % { $_.GetChildren() }      # SelectMany in PowerShell for complex object

$a = (1,2,3),('X','F'),'u','y'
$a.Length                # output is 4
($a | % { $_ }).Length   # output is 7

다른 예

$dirs = dir -dir c:
$childFiles = $dirs | % { $_.GetFiles() }
$dirs.Length          # output is 6
$childFiles.Length    # output is 119

합하면 할 수 있습니다.Foreach-Object그리고.Where-Object다음과 같이:

$ipaddresses = @(
  Get-WmiObject Win32_NetworkAdapterConfiguration | 
  ? { $_.IPAddress -ne $null } |
  % { $_.IPAddress } |
  ? { $_ -notlike "127.*" -and $_ -notlike "*::*" })

참고.@(...). 따라서 내부 파이프라인의 결과가 아무것도 아닌 경우 빈 배열이 다음에 할당됩니다.$ipaddresses.

Select Many의 PowerShell과 동등한 기능은 다음과 같습니다.Select-Object -ExpandProperty <property name of a collection>. 그러나 이 예제에서는 이 속성이 잘 작동하지 않습니다.IPAddress는 문자열의 배열입니다.스트링 제품의 배열을 평탄화하는 것은 다른 속성들이 첨부된 개별 스트링들입니다. 예를 들어:

Get-WmiObject Win32_NetworkAdapterConfiguration | Where {$_.IPAddress} | 
    Select Description -Expand IPAddress

안타깝게도 PowerShell은System.String개체를 특별하게 표시하고 결과적으로 문자열의 값(이 경우 IPAddress) 외에는 표시하지 않습니다.다른 속성(이 예제의 설명)도 표시하도록 하는 것은 실용적이지 않습니다(가능합니까?).AFACT.

언급URL : https://stackoverflow.com/questions/5241441/powershell-equivalent-of-linq-selectmany-method

반응형