时间戳未以批处理方式返回

时间:2015-02-20 00:12:43

标签: batch-file scripting cmd timestamp

如果exe文件在最新版本之前加上时间戳,我正在尝试运行批处理文件来更新某些软件。为此,我使用了一个众所周知的for循环。

当我这样做时:

set file=%AppData%\spark\spark.properties
for %%a in (%file%) do set olddate=%%~ta
echo %olddate%

返回时间戳 当我像这样运行时:

set spark_exe=%ProgramFiles%\Spark\Spark.exe
for %%a in (%spark_exe%) do set olddate=%%~ta
echo %olddate%

不会返回时间戳。 (也不包括该文件夹中的任何其他文件)
如果我跑:

set spark_exe=%ProgramFiles%\Spark\Spark.exe
for %%a in (%spark_exe%) do set fqp=%%~fa
echo %fqp%

我获得了完全合格的路径。

所以...我可以使用一些扩展变量......但不能使用其他......为什么?...怎么做?...帮助?

谢谢:)

1 个答案:

答案 0 :(得分:0)

我尝试了下面的批处理代码并且工作正常:

@echo off
if exist "%ProgramFiles%\Spark\Spark.exe" (
    set "spark_exe=%ProgramFiles%\Spark\Spark.exe"
) else if exist "%ProgramFiles(x86)%\Spark\Spark.exe" (
    set "spark_exe=%ProgramFiles(x86)%\Spark\Spark.exe"
) else (
    echo Error: Could not find Spark.exe
    pause
    goto :EOF
)
for %%a in ("%spark_exe%") do echo %%~ta
set "spark_exe="

我还用%%~ta替换%%~fa来获取带路径的文件名,而不是上次修改日期,它也有效。

然后我使用了Sysinternals的Process Monitor并在Spark.exe上记录了文件系统访问。

我可以看到cmd.exe发出两个类型为 FileBothDirectoryInformation IRP_MN_QUERY_DIRECTORY个请求来检查文件是否存在,并在批处理文件{{}中使用该文件的全名1}}。

批处理文件中有%%~fa个相同的两个IRP_MN_QUERY_DIRECTORY请求。但另外还有一个IRP_MJ_QUERY_INFORMATION请求与IRP_MN_QUERY_DIRECTORY不同,因为它是用文件句柄完成的。

当执行批处理文件时,编译器当前是否可能创建%%~ta,因此对Spark.exe之类的任何其他应用程序拒绝对文件的任何访问?

我建议也使用Sysinternals的Process Monitor,并将路径以Spark.exe结尾定义为 include 过滤器。然后运行批处理文件。如果您在日志中可以看到任何访问被拒绝,请立即查看Process Monitor。