交换HTML文件中的文本

时间:2015-06-02 18:15:38

标签: html powershell

我想更新HTML文件中的一些文字。 HTML文件中的文字:

<html><body>Normal</body></html>

我想将Normal更改为Rollout,反之亦然。我的代码起初是

(Get-Content C:\temp\a.html) |
ForEach-Object {$_ -replace "Normal", "Rollout"} |
Set-Content C:\temp\a.html

这很好用,除了我想运行相同的脚本将其从rollout更改为normal。我正在尝试一些if if else if但是那也不起作用。以下是使用if..elseif的许多尝试之一:

$a = Get-Content C:\temp\a.html
(Get-Content c:\temp\a.html) |
if($a -match "Normal")
{
ForEach-Object {$_ -replace "Normal", "Rollout"} 
} |
Elseif($a -match "Rollout")
{
ForEach-Object {$_ -replace "Rollout", "Normal"}
} |
Set-Content C:\temp\b.html

我如何以不同的方式处理这个问题?

6 个答案:

答案 0 :(得分:3)

使用[regex]::replace,脚本块委托和替换哈希:

$replace = @{
Normal = 'Rollout'
Rollout = 'Normal'
}

$x = @(
'<html><body>Normal</body></html>'
'<html><body>Rollout</body></html>'
)

$x | foreach { [regex]::Replace( $_,'(Normal|Rollout)',{$replace[$args[0].value]} ) }

<html><body>Rollout</body></html>
<html><body>Normal</body></html>

这将在“正常”和“推出”之间切换

答案 1 :(得分:2)

我使用[xml]类型直接编辑节点,而不是替换字符串。

$html = [xml](Get-Content c:\temp\a.html)
$html.html.body = "Rollout"
$html.InnerXml | Set-Content C:\temp\b.html

答案 2 :(得分:1)

如果/ ElseIf可能出现严重错误,并且我在这种情况下看到的#1错误是既不包含Normal也不包含Normal的行,并且不会通过。显然,这个问题有几个答案,说实话,我可以选择mjolinor的答案,因为它可能是最快的,因为RegEx很棒。但是,既然看起来你不想走这条路,我建议用Switch语句替换你的If / ElseIf语句,因为它只是更好。

$(Switch -RegEx (Get-Content C:\Path\To\File.html){
    "Normal" {$_ -replace "Normal", "Rollout"; Continue}
    "Rollout" {$_ -replace "Rollout", "Normal"; Continue}
    default {$_}
}) | Set-Content C:\Path\To\File.html

这实际上与你已经完全相同。而不是说如果这个/ ElseIf / Switch cmdlet占用每一行,并且在这种情况下因为我使用了-RegEx参数,它尝试将每一行与第一个案例相匹配(匹配&#34 ;正常&#34)。如果找到匹配项,则执行以下脚本块(通过该行,替换&#34;正常&#34;使用&#34; Rollout&#34;,然后运行Continue命令,这将导致循环移动到下一个项目。)

然后转移到第二种情况,在那里它试图匹配&#34; Rollout&#34;如果它找到它,它会执行该情况的scriptblock,它通过该行代替&#34; Rollout&#34;使用&#34;正常&#34;,再次运行Continue以移动到下一个项目。

然后它移动到默认情况下运行任何东西,并按原样通过该行。

它在子表达式中运行整个Switch循环,并且所有输出都通过管道传递到Set-Content cmdlet来写入文件。

现在,就像我说的那样,我会使用mjolinor的答案来提高速度和简洁性,但我认为这是运行解决方案的更好方法。

答案 3 :(得分:0)

你很亲密。这是一个改编自原始代码的解决方案:

(Get-Content C:\temp\a.html) |
ForEach-Object {
    if($_ -match "Normal") { $_ -replace "Normal", "Rollout"} 
    elseif($_ -match "Rollout") { $_ -replace "Rollout", "Normal"}
} | 
Set-Content C:\temp\a.html

答案 4 :(得分:0)

嗯,我自己想到了一种不同的方法,并想出了这个代码,这对我来说非常有效!

$a = Get-Content C:\temp\b.html
if ($a -match "Normal") {
  (Get-Content c:\temp\b.html) |
    ForEach-Object {$_ -replace "Normal", "Rollout"} |
    Set-Content C:\temp\b.html
} elseif($a -match "Rollout") {
  (Get-Content c:\temp\b.html) |
    ForEach-Object {$_ -replace "Rollout", "Normal"} |
    Set-Content C:\temp\b.html
}

答案 5 :(得分:0)

使用Internet Explorer COM对象的另一种方法:

$file = 'C:\path\to\your.html'

$ie = New-Object -COM 'InternetExplorer.Application'
$ie.Navigate("file://$file")

do { Start-Sleep -Milliseconds 100 } until ($ie.ReadyState -eq 4)

$ie.Document.body.innerText = switch ($ie.Document.body.innerText) {
  'Normal'  { 'Rollout' }
  'Rollout' { 'Normal' }
}

$ie.Document.documentElement.outerHtml | Set-Content $file

$ie.Quit()