如果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%
我获得了完全合格的路径。
所以...我可以使用一些扩展变量......但不能使用其他......为什么?...怎么做?...帮助?
谢谢:)
答案 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。