我正在调用Get-Content来检索包含标准字符串占位符的HTML页面(例如' {0}',' {1}'等等)允许使用-f运算符进行填充。
HTML页面有一个CSS样式,需要花括号,但这些与-f运算符冲突。我希望保持HTML页面符合要求,以便我可以在浏览器中轻松查看它以便于编辑,但是双花括号会弄乱这一点。为什么需要花括号?
未加载的HTML页面
<html>
<header>
<style>
div.Content{
background-color: red
}
</style>
</header>
<body>
<div class="Content">{0}</div>
</body>
</html>
PowerShell代码
$webPage = Get-Content -Path "C:\Users\timothyo\Documents\TestHtml.htm"
$webPage = $webPage -f "Hello World!"
$webPage
错误
Error formatting a string: Input string was not in a correct format..
将加载和填充地方持有人的HTML页面
注意样式标记中的双花括号
<html>
<header>
<style>
div.Content{{
background-color: red
}}
</style>
</header>
<body>
<div class="Content">{0}</div>
</body>
</html>
答案 0 :(得分:0)
Get-Content返回一个数组,而不是像你期望的那样的字符串。您可能想要使用-Raw
开关。即便如此,您的替换令牌的方法也可能存在问题。使用不同类型的令牌/格式和替换方法可以更好地扩展。
考虑使用类似“{[setting1]}”的标记,如
<body>
<div class="Content">{[setting1]}</div>
</body>
并阅读您的文件:
$htmFileTemplate = "C:\Users\timothyo\Documents\TestHtml-TEMPLATE.htm"
$htmFile = "C:\Users\timothyo\Documents\TestHtml.htm"
$template = Get-Content $htmFileTemplate -Raw
$template = $template.Replace("{[setting1]}", "Hello World!")
(可选)使用HtmlDecode,以便你的hlink工作......
[System.Web.HttpUtility]::HtmlDecode($template) | Out-File $htmFile -Force
答案 1 :(得分:0)
我强烈建议使用-f
格式命令 not 。
你很难解决这个问题。我能看到的唯一一个黑客就是通过一个正则表达式替换过滤器,当它检测到{\d}
时会使括号加倍。如果您无论如何都要使用replace
......
只需使用-replace
功能并定义自己的替换模式。
$webPage = Get-Content -Path "C:\Users\timothyo\Documents\TestHtml.htm"
# define your first replace with {{new_word}}
$webPage = $webPage -replace "{{new_word}},"Hello World!"
$webPage
如果您多次这样做,请尝试我写的这个函数,它将允许您获取文件,进行替换,并输出到另一个文件。
function Get-FileWithReplace {
param(
[string]$sourceFilename, # e.g. d:\test.txt
[string]$targetFilename, # e.g. d:\test2.txt
[hashtable]$replaces, # e.g. @{"FIND_KEY" = "replace with this"; ... }
[bool]$isCaseSensitive = $false
)
Write-Host "Get-FileWithReplace $sourceFilename to $targetFilename ..." ;
$sourceText = Get-Content $sourceFilename ;
foreach($search in $replaces.Keys) {
$replace = $replaces[$search] ;
if ($isCaseSensitive -eq $true) {
$sourceText = $sourceText -creplace $search, $replace ;
} else {
$sourceText = $sourceText -replace $search, $replace ;
}
}
$sourceText | Out-File -Encoding ASCII $targetFilename ;
}
Get-FileWithReplace `
-sourceFilename "C:\Users\timothyo\Documents\TestHtml.htm" `
-targetFilename "C:\Users\timothyo\Documents\TestHtmlOut.htm" `
-replaces @{
"{first_word}" = "First Word";
"{pi}" = 3.14159;
} `
-isCaseSensitive $true ;