用于在邮件正文中显示可变内容的批处理脚本

时间:2014-12-27 16:43:10

标签: batch-file

我有批处理脚本,它在邮件正文中显示变量内容(%Build%)。

例如,如果可变内容具有: %Build%= aa001.skc

脚本触发的邮件的邮件正文如下(OUTPUT)。

“为文件aa001.skc生成的跳过文件”

(想象一下test.log中包含值aa001.skc)

下面是我目前的相同脚本:

@echo off

for /f "delims=" %%x in (C:\Users\Desktop\test.log) do (
set Build=%%x
echo %Build%
)

"blat.exe" -to "abc@gmail.com" -cc "abc@gmail.com","xyz@gmail.com" -f 123@test.com -body "Skip file generated for the files %Build%" -subject "Skip file found" -server mailout.xyz.com

exit

但是如果test.log包含值为

aa001.skc

aa002.skc

aa003.skc

使用上面的脚本,我的输出仅在邮件正文中显示如下。 当前输出: “为文件aa003.skc生成的跳过文件”(它取最后一个值,不知道如何将它放入邮件正文中的for循环中)

但邮件正文的输出应该如下所示。

“为文件生成的跳过文件

aa001.skc

aa002.skc

aa003.skc“

请帮助我实现同样的目标。

1 个答案:

答案 0 :(得分:1)

批处理文件以setlocal指令开始是正常的,这有效地确保了批处理结束时环境保持不变,因此运行连续批处理不会累积污染物的更改以进一步批处理执行。

修复您的流程 - 版本1

@echo off
setlocal
for /f "delims=" %%x in (C:\Users\Desktop\test.log) do (
 call set "Build=%%x %%build%%"
 call echo %%Build%%
)
blat ......

(在这一项中,setlocal并非绝对必要 - 我假设它是call来自另一批次的<{p}}

[编辑:添加换行符] BLAT缺乏记录的特征是,正文中的管道符(|)被转换为换行符,因此

@echo off
setlocal
set "build=|"
for /f "delims=" %%x in (C:\Users\Desktop\test.log) do (
 call set "Build=%%x|%%build%%"
 call echo %%Build%%
)
blat ......

您可能还希望在%build%参数中-body之后插入一个管道。

[最终编辑]

另一种常见方法是使用delayedexpansion

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%x in (C:\Users\Desktop\test.log) do (
 set "Build=%%x !build!"
 echo !Build!
)
blat ......

(setlocal enabledelayedexpansion required, notice the来电已经消失了。

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此 - 实际上你没有说过的话。您的代码应该已经显示FOR ... DO (block)的原始值三次。现在 - 如果从早期的运行中保留了它,它将显示最后一次的值三次。另一方面,如果你有一个干净的环境,那么由于build没有设置,你应该看到build三次。

请参阅echo is off上的无尽SO项目以获取更多信息。