【问题标题】:Timestamp Not Returned in Batch未批量返回时间戳
【发布时间】:2015-02-20 00:12:42
【问题描述】:

如果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%

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

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

谢谢:)

【问题讨论】:

  • 尝试使用引号 -> set "spark_exe=%ProgramFiles%\Spark\Spark.exe"for %%a in ("%spark_exe%") do set olddate=%%~ta
  • 没有变化...我什至尝试将 fqp 放在括号之间但没有运气

标签: batch-file scripting cmd timestamp


【解决方案1】:

我尝试了下面的批处理代码,它成功了:

@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 请求,以检查文件是否存在并在批处理文件 %%~fa 中使用时获取文件的全名。

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

是否有可能Spark.exe 当前是由编译器在执行批处理文件时创建的,因此任何其他应用程序(如cmd.exe)对文件的任何访问都被拒绝?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多