0

我正在尝试运行一个批处理脚本来查找特定文件的最后修改日期。我正在使用类似于以下脚本的内容:

@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 

弄清楚出了什么问题是令人困惑的。

4

1 回答 1

3

呻吟...

这一定是 Windows 批处理开发中最常见的错误。您正在尝试扩展在同一代码块中设置的变量。但是当整个代码块被解析时,变量会被扩展,所以你得到的是在代码块被执行之前存在的值。这显然是行不通的。

在命令提示符下键入HELP SETSET /?并阅读处理延迟扩展的部分。这向您展示了解决问题的一种方法。

但在你的情况下,你根本不需要变量,所以你不需要延迟扩展。当您附加到 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%
)
于 2012-09-20T19:38:31.410 回答