我有一个模板,其%%a
变量占位符出现在多个位置。我有一个300个ID的文本文件,我需要为每个ID将模板写入一个文件,用ID代替变量。
我尝试使用批处理文件执行此操作,但我认为它存在<
和>
个字符的问题!
我该如何解决这个问题?
谢谢!代码如下
<div class="ct-gallery col-sm-6 col-md-2">
<a class="ct-js" href="./assets/images/content/%%a.jpg" title="%%a">
<figure class="ct-hover">
<img src="./assets/images/content/%%a.jpg" alt="">
<figcaption>
<h2>%%a</h2>
</figcaption>
</figure>
</a>
</div>
for /f "tokens=*" %%a in (ids.txt) do (
echo <div class="ct-gallery col-sm-6 col-md-2"> <a class="ct-js" href="./assets/images/content/%%a.jpg" title="%%a"> <figure class="ct-hover"> <img src="./assets/images/content/%%a.jpg" alt=""> <figcaption> <h2>%%a/h2> </figcaption> </figure> </a> </div> >> output.txt
)
答案 0 :(得分:2)
您可以使用^
转义问题字符来修复现有的批处理代码。
for /f "tokens=*" %%a in (ids.txt) do (
echo ^<div class="ct-gallery col-sm-6 col-md-2"^> ^<a class="ct-js" href="./assets/images/content/%%a.jpg" title="%%a"^> ^<figure class="ct-hover"^> ^<img src="./assets/images/content/%%a.jpg" alt=""^> ^<figcaption^> ^<h2^>%%a/h2^> ^</figcaption^> ^</figure^> ^</a^> ^</div^> >> output.txt
)
但是你的方法破坏了空白格式,实现起来很繁琐。
有一个更优雅的解决方案,纯批次很容易实现。
将模板嵌入到您的脚本中,并在每行前面加::label:
。只要每个模板都有唯一的::label:
,您就可以拥有任意数量的模板。模板可以出现在脚本的任何位置 - 我选择将它放在顶部附近。
修改模板以使用!a!
代替%%a
,并启用延迟展开。让你的外部循环为每个迭代值定义一个a
变量,然后添加第二个FOR / F循环以从脚本中读取模板,保留::label:
之后的所有文本,并写出值。在FOR变量扩展后发生延迟扩展,因此变量将根据需要进行替换。
@echo off
setlocal enableDelayedExpansion
::1: <div class="ct-gallery col-sm-6 col-md-2">
::1: <a class="ct-js" href="./assets/images/content/!a!.jpg" title="!a!">
::1: <figure class="ct-hover">
::1: <img src="./assets/images/content/!a!.jpg" alt="">
::1: <figcaption>
::1: <h2>!a!</h2>
::1: </figcaption>
::1: </figure>
::1: </a>
::1: </div>
>>output.txt (
for /f %%A in (ids.txt) do (
set "a=%%A"
for /f "delims=: tokens=1*" %%B in ('findstr "^::1:" "%~f0"') do echo(%%C
)
)
这种方法有几个优点:
<
。有一些限制:
!
转义,否则您的ID和模板都不能包含^!
文字。:
开头。一些额外的编码可以消除这种限制,但我怀疑你需要这种复杂性。答案 1 :(得分:1)
要简化以前的批处理脚本,您可以运行类似这样的PowerShell命令:
$row = '<div class="ct-gallery col-sm-6 col-md-2"> <a class="ct-js" href="./assets/images/content/%%a.jpg" title="%%a"> <figure class="ct-hover"> <img src="./assets/images/content/%%a.jpg" alt=""> <figcaption> <h2>%%a/h2> </figcaption> </figure> </a> </div>'
Get-Content .\ids.txt | % { $row -replace '%%a',$_ } >> output.txt
请注意,单引号封装$row
变量以保留双引号。
答案 2 :(得分:0)
你的措辞有点不吉利 我在div类模板中使用here字符串,并使用powershell插入ID(如@muratiacos建议)。但AFAIK不应该有几个同名的div类。
powershell脚本SO49647312.ps1
$div_class_template = @"
<div class="ct-gallery col-sm-6 col-md-2">
<a class="ct-js" href="./assets/images/content/#insert_id_here#.jpg" title="#insert_id_here#">
<figure class="ct-hover">
<img src="./assets/images/content/#insert_id_here#.jpg" alt="">
<figcaption>
<h2>#insert_id_here#</h2>
</figcaption>
</figure>
</a>
"@
Get-Content .\ids.txt | ForEach-Object {
$div_class_template.replace("#insert_id_here#",$_) | Out-File -Append output.txt
}