如何使用Powershell呈现可点击链接

时间:2013-03-22 22:42:31

标签: powershell powershell-v2.0 powershell-ise

我使用下面的powershell脚本将输出写入html文件,问题是它将所有内容呈现为文本。

我的代码:

$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

提前致谢

3 个答案:

答案 0 :(得分: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

更新:

这是一种更好的方式来处理所有html实体:

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

答案 1 :(得分:2)

$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

答案 2 :(得分:0)

除了使用Html :: Decode或RegExps之外,还有一种更通用的方法。它要复杂得多,但它有用,当某些列除了链接列之外,包含特殊的HTML字符,不应该像链接一样处理(例如$ PageTitle有类似&#34; foo&lt; bar&# 34;,在使用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'

检索第n列单元格的XPath字符串是&#39; // x:table / x:tr / x:td [n]&#39;,其中n - 是列数(索引从1开始) )。关于使用XML命名空间的一些说明(例如XmlNamespaceManager和funky&#39; x:&#39;前缀)可以在这里找到:Xml Namespace breaking my xpath!

要一次修改多个列,可以使用以下XPath:&#39; // x:table / x:tr / x:td [position()= 1或position()= 2或...或者位置()=最后()]&#39;

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
}