我有批处理脚本,它在邮件正文中显示变量内容(%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“
请帮助我实现同样的目标。
答案 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项目以获取更多信息。