我想更新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
我如何以不同的方式处理这个问题?
答案 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()