2014-09-18 4 views
2

정렬되지 않은 HTML 목록을 생성하는 함수를 만들려고합니다. 이것은 ConvertTo-HTMLlist $MyArray처럼 사용할 때 잘 작동하지만, 정보를 파이프에 넣으면 $MyArray | ConvertTo-HTMLlist을 좋아하지 않습니다.PowerShell 정렬되지 않은 HTML 목록

내 기능 :

Function ConvertTo-HTMLlist { 
    [CmdletBinding(SupportsShouldProcess=$True)] 
    Param (
     [parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)] 
     [ValidateNotNullOrEmpty()] 
     $Array 
    ) 
    Process { 
     $Array = @(foreach ($_ in $Array) {"<li>" + $_ + "<br><br></li>"}) # Add extra space 
     $Array = ,"<ul>$($Array | Sort-Object)</ul>" 
     $Array = $Array.Replace("<br><br></li></ul>", "</li></ul>") # Remove last double breaks 
     $Array += "<p><i><font size=`"2`">* Native PowerShell errors are displayed in <font color=`"red`">red</font>.</font></i></p>" 
     Write-Output $Array 
    } 
} 

결과 :

$MyArray = 'Apples', 'Peers', 'Bananas' 

ConvertTo-HTMLlist $MyArray 

# Correct result: 
<ul><li>Apples<br><br></li> <li>Bananas<br><br></li> <li>Peers</li></ul><p><i><font size="2">* Native PowerShell errors are displayed in <font color="red">red</font>.</f 
ont></i></p> 

$MyArray | ConvertTo-HTMLlist 

# Incorrect result:  
<ul><li>Apples</li></ul><p><i><font size="2">* Native PowerShell errors are displayed in <font color="red">red</font>.</font></i></p> 
<ul><li>Peers</li></ul><p><i><font size="2">* Native PowerShell errors are displayed in <font color="red">red</font>.</font></i></p> 
<ul><li>Bananas</li></ul><p><i><font size="2">* Native PowerShell errors are displayed in <font color="red">red</font>.</font></i></p> 

이 먼저 파이프 라인에 이르기까지 모든 것을 수집하는 방법, 그리고 후 처리를 시작해야합니다.

+0

IMHO 파이프 라인은 한 번에 하나의 요소 만 처리하기 때문에이 방법은 없습니다. 여기서 모든 요소 (전체 배열)를 한 번에 처리합니다. @mjolinor가 말한 것과 같은 방식으로 다음을 사용할 수 있습니다 :', $ myarray | ConvertTo-HTMLlist'를 사용하십시오. –

+0

피드백에 대해 CB에 감사드립니다. 그동안 해결책을 찾았으니 아래에서 내 대답을 확인하십시오. – DarkLite1

답변

0

모든 것이 PowerShell에서 가능하므로 함수에서 Begin, ProcessEnd 절을 사용하여 좀 더 많은 작업을 수행했습니다. 그리고 나는 그것이 원하는대로 일하고 있다고 생각합니다 :

$MyArray = 'Apples', 'Peers', 'Bananas' 

Function ConvertTo-HTMLlist { 
    [CmdletBinding(SupportsShouldProcess=$True)] 
    Param (
     [parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)] 
     [ValidateNotNullOrEmpty()] 
     $Array 
    ) 
    Begin { 
     $tmpArray = New-Object System.Collections.ArrayList 
    } 
    Process { 
     $Array | ForEach-Object { 
      $tmpArray.Add("<li>" + $_ + "<br><br></li>") | Out-Null 
     } 
    } 
    End { 
     $tmpArray = ,"<ul>$($tmpArray | Sort-Object)</ul>" 
     $tmpArray = $tmpArray.Replace("<br><br></li></ul>", "</li></ul>") # Remove last double breaks 
     $tmpArray += "<p><i><font size=`"2`">* Native PowerShell errors are displayed in <font color=`"red`">red</font>.</font></i></p>" 
     Write-Output $tmpArray 
    } 
} 

Write-Host "Piped result:" -ForegroundColor Yellow 
$MyArray | ConvertTo-HTMLlist 

Write-Host "Non piped result:" -ForegroundColor Yellow 
ConvertTo-HTMLlist $MyArray 

당신의 생각을 알려주세요.

관련 문제