在Powershell中使用-replace或.replace将TD值更改为链接

时间:2014-02-18 16:06:54

标签: html xml powershell

我正在尝试生成Powershell中收集的数据的HTML报告。我想最终得到HTML链接,以获取有关表中不同元素的更具体信息。特别是,第一列包含虚拟机的名称,但这不是特别重要。我试图用链接替换名称值。

 for($i=1; $i -le $xml.table.tr.Count-1; $i++){
 $xml.table.tr[$i].td[0].replace($xml.table.tr[$i].td[0],"<a href=`"http://stackoverflow.com`">myLink</a>")
 }

  $file = Join-Path C:\users\myname\Documents "VMSpecs.html"

  ConvertTo-Html -Title "VM Specs" `
  -CssUri C:\Users\myname\Documents\style.css `
  -Body $($xml.InnerXml) | Out-file $file


 Invoke-item $file

根据输出,$ xml.table.tr [$ i] .td [0]的值将被链接信息替换,但不会永久替换。当文件写入HTML时,无法找到链接信息,原始值仍保留在td el

所以,大局,我想知道如何在特定位置将链接附加到html -fragment中。任何样本或资源都有很大的责任。

1 个答案:

答案 0 :(得分:1)

两者.Replace和-replace都会生成一个新字符串。你想要做的是重新分配结果:

for($i=1; $i -le $xml.table.tr.Count-1; $i++){
  $xml.table.tr[$i].td[0] = $xml.table.tr[$i].td[0].replace($xml.table.tr[$i].td[0],"<a href=`"http://stackoverflow.com`">myLink</a>")
 }

虽然在这种特殊情况下,似乎根本不需要替换。由于您要替换td的全部内容,只需直接指定它:

 for($i=1; $i -le $xml.table.tr.Count-1; $i++){
  $xml.table.tr[$i].td[0] = "<a href=`"http://stackoverflow.com`">myLink</a>"
 }

我最初误读了你的问题是关于替换,而不是分配给一个节点。看起来当你得到如上所述的特定元素时,PowerShell会将其转换为字符串,因此你实际上并没有更新节点。试试这个:

 for($i=1; $i -le $xml.table.tr.Count-1; $i++){
  ($xml.table.tr[$i].GetElementsByTagName("td") | Select-Object -First 1)."#text" = "<a href=`"http://stackoverflow.com`">myLink</a>"
 }

“#text”属性可能会有所不同,我不确定。我使用一个非常简单的HTML文件进行了测试,并且通过在生成的XML对象的每个级别上执行Get-Member,我发现这是我需要更新的属性。

嗯......好吧,试试吧。创建一个包含该链接的新XML元素,并将其附加到td元素:

for($i=1; $i -le $xml.table.tr.Count-1; $i++){
  $link = $xml.CreateElement("a")
  $link.SetAttribute("href", "http://stackoverflow.com")
  $link.InnerText = "myLink"
  $xml.table.tr[$i].FirstChild."#text" = ""
  $xml.table.tr[$i].FirstChild.AppendChild($link)
}