2013-03-22 67 views
4

我正在使用下面的powershell腳本將輸出寫入html文件,問題在於它將所有內容呈現爲文本。如何使用Powershell呈現可單擊的鏈接

我的代碼:

$PagesObject = New-Object PSObject 
Add-Member -input $PagesObject noteproperty 'Site Url' $spweb.url 
Add-Member -input $PagesObject noteproperty 'Page Title' $PageTitle 
Add-Member -input $PagesObject noteproperty 'Page Url' "<a href="$PagesUrl">$PageTitle</a>"  
$results += $PagesObject 
$results | ConvertTo-HTML -head $a -body | Out-File \\myfolder\InventoryReports\$CurrentMonth.html 

我想呈現爲可點擊的鏈接下面的截圖

檢查,看看它是如何事先現在渲染 enter image description here

感謝

回答

6

的PowerShell編碼特殊字符。要解決這個問題的一種方法是將它們轉換回來,然後將結果寫加時賽文件:

$pso = New-Object PSObject -Property @{ 
    SiteUrl = $spweb.url 
    PageTitle= $PageTitle 
    PageUrl = "<a href='$PagesUrl'>$PageTitle</a>" 
} | ConvertTo-Html 


$pso -replace '&gt;','>' -replace '&lt;','<' -replace '&#39;',"'" | 
Out-File \\myfolder\InventoryReports\$CurrentMonth.html 

UPDATE:

這裏有一個更好的辦法,將採取所有的HTML實體的護理:

Add-Type -AssemblyName System.Web 
[System.Web.HttpUtility]::HtmlDecode($pso) 
+0

我應該在哪裏添加這個'Add-Type -AssemblyName System.Web [System.Web.HttpUtility] :: HtmlDecode($ pso)'在腳本開始處? – Nish 2013-03-23 15:26:26

+0

是的,或者在你第一次使用它之前。 – 2013-03-23 17:48:01

1

$pso = New-Object PSObject -Property @{ 
    SiteUrl = $spweb.url 
    PageTitle= $PageTitle 
    PageUrl = "<a href='$PagesUrl'>$PageTitle</a>" 
} | ConvertTo-Html 

Add-Type -AssemblyName System.Web 

[System.Web.HttpUtility]::HtmlDecode($pso) | 
Out-File \\myfolder\InventoryReports\$CurrentMonth.html 
0

還有就是要做到這一點,不是使用HTML ::解碼或註冊其他更通用方式EXPS。它要複雜得多,但它可能是有用的,當一些列,除了鏈接列,包含特殊的HTML字符,不應該像鏈接處理(例如$ PageTitle有類似「foo <酒吧」,什麼會打破標記在使用Html :: Decode之後)。

這種方法使用ConvertTo-Html生成的有效XHTML,可以在Powershell/.Net XML設施中使用。主要想法是將cmdlet輸出轉換爲XML文檔,然後使用XPath檢索鏈接列,並修改它們以使用DOM功能創建鏈接。

這裏是代碼片斷:

$pso = New-Object PSObject -Property @{ 
    SiteUrl = 'foobar.org' 
    PageTitle = 'x&z a<b<c' 
    PageUrl = 'foobar.org/contact.html' 
} | ConvertTo-Html 

$xmlDoc = [xml]$pso 
$xhtmlNS = 'http://www.w3.org/1999/xhtml' 
$xmlNSManager = New-Object System.Xml.XmlNamespaceManager $xmlDoc.NameTable 
$xmlNSManager.AddNamespace('x', $xhtmlNS) 
$xmlDoc.SelectNodes('//x:table/x:tr/x:td[3]', $xmlNSManager) | %{ 
    $a = $xmlDoc.CreateElement('a', $xhtmlNS) 
    $a.setAttribute('href', $_.'#text') 
    [void]$a.AppendChild($xmlDoc.CreateTextNode('Contact Us')) 
    [void]$_.ReplaceChild($a, $_.FirstChild) 
} 

$xmlDoc.OuterXml | Out-File 'test.html' 

XPath字符串來檢索第n列的單元是 '// X:表/ X:TR/X:TD [n]的',其中n - 是數列(索引從1開始)。可以在這裏找到關於使用XML命名空間的一些說明(例如XmlNamespaceManager和funky'x:'前綴):Xml Namespace breaking my xpath!

要一次修改多個列,可以使用以下XPath:'// x:table/x:tr/x:td [position()= 1 or position()= 2 or ... or position()= last()]'

foreach ($td in $xmlDoc.SelectNodes('//x:table/x:tr/x:td[position()=1 or position()=2 or ... or position()=last()]', $xmlNSManager)) { 
    # processing first column cells 
    [void]$foreach.MoveNext() 
    # processing second column cells 
    [void]$foreach.MoveNext() 
    # etc 
} 
相關問題