使用cmdlet的双花括号的问题HTML文件的Get-Content

时间:2018-01-10 23:47:37

标签: powershell

我正在调用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>

2 个答案:

答案 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 ;