批处理脚本获取远程文件的上次修改日期

时间:2012-09-20 18:17:59

标签: batch-file

我正在尝试运行批处理脚本,该脚本将查找特定文件的最后修改日期。我正在使用类似于以下脚本的东西:

@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 

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

1 个答案:

答案 0 :(得分: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%
)