Loops 包含循环的Powershell文本/html模板

Loops 包含循环的Powershell文本/html模板,loops,templates,powershell,Loops,Templates,Powershell,我知道如何从文本模板内部进行字符串替换,比如 文本文件 Hello ${name} 时尚 [string] $name = "World" $template = Get-Content 'c:\temp\docs\template.txt' $expanded = $ExecutionContext.InvokeCommand.ExpandString($template) $expanded 预期产量 Hello World <div>title<div> &l

我知道如何从文本模板内部进行字符串替换,比如

文本文件

Hello ${name}
时尚

[string] $name = "World"
$template = Get-Content 'c:\temp\docs\template.txt'
$expanded = $ExecutionContext.InvokeCommand.ExpandString($template)
$expanded
预期产量

Hello World
<div>title<div>
<ul>
    <li>First Point</li>
    <li>Second Point</li>
</ul>

这一切都很好,但如果我需要更先进的东西呢

文本文件

Hello ${name}
标题
    $(${points}{124;%{$})
时尚

[string] $name = "World"
$template = Get-Content 'c:\temp\docs\template.txt'
$expanded = $ExecutionContext.InvokeCommand.ExpandString($template)
$expanded
[string[]$points=“第一点”,“第二点”
$template=获取内容'c:\temp\docs\template.txt'-force
$expanded=调用表达式$template
美元扩大
预期产量

Hello World
<div>title<div>
<ul>
    <li>First Point</li>
    <li>Second Point</li>
</ul>
详细说明 ${description} {ifdef链接} 相关命令 ${links} {endif links} {ifdef参数} 参数 名称 描述 必修的? 管道输入 默认值 {foreach param in${parameters} $($param.Name) $($param.Description) $(需要参数) $(参数PipelineInput) $(参数默认值) {endforeach} {endif参数} {ifdef notes} 笔记 ${notes} {endif notes} {ifdef示例} 例子 {foreach示例在${examples}} 例子 ${example.code} ${example.comments} {endforeach}
我真的很想找到一个好的答案,但我会在评论中进一步阐述我的建议。我相信你自己有能力做到这一点,但这对某些人来说可能是有价值的

如果您的文件包含

标题
    ${list}
然后我们可以这样做来填充列表

$list=(“第一点”,“第二点”| ForEach对象{“`t
  • ${/li>”})-连接“`r`n” $template=获取内容'c:\temp\docs\template.txt'-raw $ExecutionContext.InvokeCommand.ExpandString($template)
  • 是的,我知道这不完全是你要问的,但它确实有一个类似的结果

    为什么不把整个文件转换成代码呢? 免责声明:我想指出,扩展字符串和从文件执行代码是两件不同的事情。如果有人在你的模板文件中放入恶意代码怎么办?你可以盲目地执行它。现实问题?不,可能的灾难?也许吧

    我更新了一小部分示例编辑,以证明该方法。是的,HTML格式不正确,很糟糕。它的存在表明了我的意思

    示例文件

    Hello ${name}
    
    “”
    '    '
    “$name”
    “

    $synosis

    ” ' ' ' ' foreach($parameters中的参数){ “$($param.Name)” “$($param.Description)” } ' '
    我之所以选择这个片段,是因为您看到了一个简单变量、引号中的简单变量和循环结构。我在大多数行周围都有单引号,因为它们将作为标准字符串输出发送。因此,我们使用以下代码:

    $name=“马特”
    $synopsis=“ughh…东西”
    $parameters=1,2 | Foreach对象{[pscustomobject]@{Name=“$\uFactory”;Description=“$\uApple”}
    $template=获取内容'c:\temp\docs\template.txt'-raw
    调用表达式$template
    
    这又是一个可怕的结果

    
    马特
    

    ughh。。。东西

    1工厂 1个苹果 2工厂 两个苹果
    我知道这是一个老问题,您有一个很好的解决方法,但我想其他人可能会对答案感兴趣。你在最初的问题中的回答非常接近

    这很有效

    template.txt

    <div>title</div>
    <ul>
        <li>First Point<\li>
        <li>Second Point<\li>
        <li>Third Point<\li>
    </ul>
    
    输出

    <div>title</div>
    <ul>
        <li>First Point<\li>
        <li>Second Point<\li>
        <li>Third Point<\li>
    </ul>
    
    标题
    
    • 第一点
    • 第二点
    • 第三点

    你有一个诀窍,使用$(在模板的第二行打开表达式。但是您的表达式没有使用正确的语法。第二个技巧是继续使用
    ExpandString
    ,就像您在提供的工作示例中所做的那样。一旦模板中提供了正确的语法,它将由
    ExpandString
    (因为我们使用的是插值字符串表达式)。输出与预期输出匹配(除了我在测试和修复格式时添加的“第三点”中留下的内容).

    如果在PowerShell中执行循环,然后使用第一个示例中的简单替换插入字符串,您会认为这是作弊吗?因为这对第二个示例有效。是的,我正在考虑,如果必须,我也会这样做,但我假设模板中必须有一种方法:SNice comment formatting:)我还想指出,扩展字符串和从文件中执行代码是两件不同的事情。如果有人在模板文件中放入恶意代码怎么办?你可以盲目地执行它。现实吗?可能吗?是的。有趣的想法。将进一步测试。如果你使模板成为一大块输出的代码,那么我可以看到
    Invoke Expression
    working…我想这会管用的。比我现在的工作要干净得多。@ChaseFlorell好吧,如果没有其他事情发生,至少这会管用。元编程很有趣!感谢@Matt的指导,我已经分享了我的最终解决方案,这是我当时正在构建的,这是它设计用来创建的输出,很好。在重构一些代码时遇到了这个问题,这些代码可以通过使用简单的模板系统进行改进。我认为使用ExpandString对我来说是可行的。您的应用程序需要更多的代码,而将所有这些代码塞进插值字符串子表达式是很尴尬的,因此我认为这不是您的最佳选择。