我正在尝试运行批处理脚本,该脚本将查找特定文件的最后修改日期。我正在使用类似于以下脚本的东西:
@echo off
set mainDir=\\subdomain.myintranet.net\c$
set txtFile=%mainDir%\tmp.txt
set txtFile2=%mainDir%\tmp2.txt
set "bodyText=^<p^>Hello,^<br /^>^<br /^>"
if exist %txtFile% (
for %%X in (%txtFile%) do (set fileDate=%%~tX)
set "bodyText=%bodyText%tmp.txt file updated as of %fileDate%^<br /^>"
) else (
set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>"
)
if exist %txtFile2% (
for %%X in (%txtFile2%) do (set fileDate2=%%~tX)
set "bodyText=%bodyText%tmp2.txt file updated as of %fileDate2%^<br /^>"
) else (
set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>"
)
set "bodyText=%bodyText%^</p^>"
echo %bodyText% > %mainDir%\mylog.txt
测试这个示例代码,我发现它有时可行,有时不行。发生的是找到文件,但fileDate
变量空白。
我还尝试在脚本的开头添加一个空变量fileDate=
,但这不起作用。
如果重要:我将批处理脚本连接到每天运行的SQL Server 2000作业。批处理文件和日志文件驻留在数据库所在的同一服务器上,但批处理脚本完全符合我在示例中显示的文件位置(这是因为如果我想从桌面运行批处理文件,它将检查/更新正确的文件。)
提前致谢, 约瑟夫
修改
输出应如下所示:
Hello,
tmp.txt file updated as of 9/19/2012 2:24 PM
tmp2.txt file updated as of 9/19/2012 10:02 AM
我有时得到的是:
Hello,
tmp.txt file updated as of
tmp2.txt file updated as of
有时我可能会得到:
Hello,
tmp.txt file updated as of 9/19/2012 2:24 PM
tmp2.txt file updated as of
弄清楚出了什么问题令人困惑。
答案 0 :(得分:3)
呻吟......
这必须是Windows批量开发中最常见的错误。您正在尝试扩展在同一代码块中设置的变量。但是在解析整个代码块时会扩展变量,因此您将获得在执行代码块之前存在的值。这显然不起作用。
从命令提示符处键入HELP SET
或SET /?
,并阅读有关延迟扩展的部分。这向您展示了解决问题的一种方法。
但在您的情况下,您根本不需要变量,因此您不需要延迟扩展。当你附加到bodyText时,只需直接使用FOR变量:
@echo off
set mainDir=\\subdomain.myintranet.net\c$
set txtFile=%mainDir%\tmp.txt
set txtFile2=%mainDir%\tmp2.txt
set "bodyText=^<p^>Hello,^<br /^>^<br /^>"
if exist %txtFile% (
for %%X in (%txtFile%) do set "bodyText=%bodyText%tmp.txt file updated as of %%~tX^<br /^>"
) else (
set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>"
)
if exist %txtFile2% (
for %%X in (%txtFile2%) do set "bodyText=%bodyText%tmp2.txt file updated as of %%~tX^<br /^>"
) else (
set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>"
)
set "bodyText=%bodyText%^</p^>"
echo %bodyText% > %mainDir%\mylog.txt
的修改
还有更多的简化空间,可以使代码更易于维护。由于您正在准备HTML文件,因此没有理由担心其他换行符,因此您不必将所有文本放入一个变量中。您可以使用多个ECHO语句。我会将你的代码结构如下(未经测试,但概念是合理的):
@echo off
setlocal
set "mainDir=\\subdomain.myintranet.net\c$"
set "br=^<br /^>"
set "p=^<p^>"
set "/p=^</p^>"
>"%mainDir%\mylog.txt" (
echo %p%Hello,%br%%br%"
for %%F in (
"%mainDir%\tmp.txt"
"%mainDir%\tmp2.txt"
) do (
if exist %%F (
echo %%~nxF file updated as of %%~tF%br%"
) else (
echo Warning: Issues finding %%~nxF.%br%"
)
echo %/p%
)