无法在PowerShell中创建具有name属性的HTML meta标记

ql3eal8s  于 2023-03-18  发布在  Shell
关注(0)|答案(2)|浏览(145)

我正在编写一个PowerShell脚本,在HTML文件的head部分添加一个 meta标记。标记必须如下所示:。
下面的通用代码片段适用于所有属性,但名为name的属性除外:

$newMeta = $doc.createElement("meta")
$newMeta.attributename = "attribute content"

这是可行的:

$newMeta = $doc.createElement("meta")
$newMeta.content = "noindex, nofollow"

但这并不:

$newMeta = $doc.createElement("meta")
$newMeta.name = "robots"

name属性在输出中被忽略。
如何将名为name的属性添加到输出中?

8hhllhi2

8hhllhi21#

假设$doc是一个XmlDocument对象,这是PowerShell的XML适配器在每个xml节点对象上的Name属性与您要添加到文档本身的name属性之间存在冲突的情况。
使用SetAttribute()方法明确设置属性值:

$newMeta.SetAttribute('name', 'robots')
PS ~> $doc = [xml]::new()
PS ~> $newMeta = $doc.CreateElement('meta')
PS ~> $newMeta.OuterXml
<meta />
PS ~> $newMeta.SetAttribute('name', 'robots')
PS ~> $newMeta.OuterXml
<meta name="robots" />
7lrncoxx

7lrncoxx2#

我没有看到其他人,所以我会尝试自己回答这个问题。据我所知,在HTML元素上设置一个名为“name”的属性是不可能的,无论是用SetAttribute()还是用一个属性(object.attributename)。
我设法通过变通方案获得了相同的效果:我首先创建一个带有占位符名称的属性,然后用字符串“name”替换占位符名称。
我知道这不是一个优雅的解决方案,我对此感到有些羞愧,但它确实有效。也许下面的片段对其他人有帮助。

$file = "somefile.html"
$content = Get-Content $file -Raw

$doc = New-Object -ComObject "HTMLFile"
$doc.IHTMLDocument2_write($content)

$meta = $doc.getElementsByName("robots") | Select-Object -First 1

if ($meta) {
    $meta.outerHTML = ""
    $doc.documentElement.outerHTML | Set-Content $file
}

$head = $doc.getElementsByTagName("head") | Select-Object -First 1
$newMeta = $doc.createElement("meta")
$newMeta.content = "noindex, nofollow"
#SetAttribute() cannot create an attribute named "name". 
#So instead I will give it a placeholder name and replace it later on.
$newMeta.SetAttribute('__nameee__', 'robots')
$newMeta.outerHTML | Add-Content $logFile
$head.appendChild($newMeta)
$doc.documentElement.outerHTML | Set-Content $file

$htmlContent = Get-Content $file -Raw

$pattern = "__nameee__"

if ($htmlContent -match $pattern) {
# Replace the placeholder attribute name with "name".
$htmlContent = $htmlContent -replace $pattern, "name"

# Overwrite the original HTML file with the updated content
    Set-Content $file -Value $htmlContent }
else {
    Write-Host "The HTML file $htmlFilePath does not contain a robots metatag."
}

相关问题