【问题标题】:How can i add new row to com HTML object powershell如何向 com HTML 对象 powershell 添加新行
【发布时间】:2021-06-26 21:29:02
【问题描述】:

我有一个表,我正在尝试使用 powershell 添加更多行,然后将其导出为新的 HTML 文件。

这是我尝试添加行的 HTML 的正文。

<BODY>
<TABLE style="WIDTH: 100%" cellPadding=5>
<TBODY>
<TR>
<TH>Bruger</TH>
<TH>Windows</TH>
<TH>Installations dato</TH>
<TH>Model</TH>
<TH>Sidst slukket</TH></TR>
<TR>
<TD>Users name</TD>
<TD>Windows 10 Pro</TD>
<TD>23-01-2020</TD>
<TD>ThinkPad</TD>
<TD>7 dage</TD></TR></TBODY></TABLE>
<TABLE>
<TBODY></TBODY></TABLE></BODY>

我想我需要更改一个对象的内部 html,但它只是抛出一个错误。 这是我的代码

$src = [IO.File]::ReadAllText($outPath)

$doc = New-Object -com "HTMLFILE"
$doc.IHTMLDocument2_write($src)

$elm = $doc.getElementsByTagName('tr')[0]
$elm.innerHTML = "<TR>New row!</TR>"

当我检查内部 html 变量时,我得到了我期望的 HTML 输出,所以它抓取了正确的对象,但无论出于何种原因,我都无法为其分配任何东西。

这是错误

Exception from HRESULT: 0x800A0258
At line:1 char:1
+ $elm.innerHTML = "<TH>User</TH>"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

【问题讨论】:

  • 在这种情况下最好从源头更改数据。该网站可能会接收某种结构化数据,然后转换为 html。仅供参考,转换为 html 比从 html 更容易。强烈建议您在另一端解决此问题。

标签: html powershell com


【解决方案1】:

您不需要修改现有 &lt;tr&gt; 元素的innerHTML 内容,而是:

  • 创建一个新的&lt;tr&gt; 元素
    • 创建任何必需的&lt;td&gt; 子元素
    • &lt;td&gt; 元素附加到新行
  • 将新行追加到现有&lt;tbody&gt;

试试这样的:

$html = @'
<BODY>
<TABLE style="WIDTH: 100%" cellPadding=5>
<TBODY>
<TR>
<TH>Bruger</TH>
<TH>Windows</TH>
<TH>Installations dato</TH>
<TH>Model</TH>
<TH>Sidst slukket</TH></TR>
<TR>
<TD>Users name</TD>
<TD>Windows 10 Pro</TD>
<TD>23-01-2020</TD>
<TD>ThinkPad</TD>
<TD>7 dage</TD></TR></TBODY></TABLE>
<TABLE>
<TBODY></TBODY></TABLE></BODY>
'@

# Create HTML document object
$doc = New-Object -ComObject HTMLFile

# Load existing HTML
$doc.IHTMLDocument2_write($html)

# Create new row element
$newRow = $doc.createElement('tr')

# Create new cell element
$newCell = $doc.createElement('td')
$newCell.innerHTML = "New row!"
$newCell.colSpan = 5

# Append cell to row
$newRow.appendChild($newCell)

# Append row to table body
$tbody = $doc.getElementsByTagName('tbody')[0]
$tbody.appendChild($newRow)

# Inspect resulting HTML
$tbody.outerHtml

您应该会看到附加到表格主体的新行:

<TBODY><TR>
<TH>Bruger</TH>
<TH>Windows</TH>
<TH>Installations dato</TH>
<TH>Model</TH>
<TH>Sidst slukket</TH></TR>
<TR>
<TD>Users name</TD>
<TD>Windows 10 Pro</TD>
<TD>23-01-2020</TD>
<TD>ThinkPad</TD>
<TD>7 dage</TD></TR>
<TR>
<TD colSpan=5>New row!</TD></TR></TBODY>

您可以创建一个不错的小辅助函数来添加新行:

function New-HTMLFileTableRow {
  param(
    [Parameter(Mandatory)]
    [mshtml.HTMLDocumentClass]$Document,
    
    [Parameter(Mandatory)]
    [string[]]$Property,

    [Parameter(Mandatory, ValueFromPipeline)]
    $InputObject
  )

  process {
    $newRow = $Document.createElement('tr')
    foreach($propName in $Property){
      $newCell = $Document.createElement('td')
      $newCell.innerHtml = $InputObject.$propName
      [void]$newRow.appendChild($newCell)
    }

    return $newRow
  }
}

然后使用like:

Import-Csv .\path\to\user-os-list.csv |New-HTMLFileTableRow -Property User,OSVersion,InstallDate,Model,LastActive -Document $doc |ForEach-Object {
  [void]$tbody.appendChild($_)
}

【讨论】:

  • 效果很好,谢谢!但是有一个问题,我怎样才能删除一行?
  • @Baxorr 不客气!对于删除节点/元素,找到父元素并删除子节点,例如。 $row1 = $doc.getElementsByTagName('tr')[1]; [void]$row1.parentElement.removeChild($row1)
  • 哥们,你太棒了!我在任何地方都找不到这方面的任何文档
  • @Baxorr 这里的诀窍是:HTML DOM 本质上是一个实时 XML 文档,所以我只是采用与编辑 xml 时相同的方法 :)
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 2011-07-25
  • 2014-08-14
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多