2014-09-18 2 views
2

Я пытаюсь создать функцию для создания неупорядоченного HTML-списка. Это отлично работает, когда я использую его как ConvertTo-HTMLlist $MyArray, но не тогда, когда я передаю ему информацию, например, $MyArray | ConvertTo-HTMLlist.Неупорядоченный HTML-код PowerShell

Моя функция:

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, Process и End. И я думаю, что у меня есть работа по желанию:

$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 

Сообщите мне, что вы думаете.

Смежные вопросы