使用批处理脚本

时间:2018-04-04 09:23:33

标签: powershell batch-file

我有一个模板,其%%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
)

3 个答案:

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