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对我来说是可行的。您的应用程序需要更多的代码,而将所有这些代码塞进插值字符串子表达式是很尴尬的,因此我认为这不是您的最佳选择。