Date 使用windows批处理脚本基于另一个文件的上次修改日期创建文件
我有一个目录,其中包含*.aaa类文件,我想使用完全相同的文件名将其转换为*.bbb类文件,只有文件格式会随着Windows命令提示符中的批处理脚本而更改 由于目录中有许多文件,我不想进行不必要的转换,因此只有当file.bbb不存在,或者file.aaa比当前的file.bbb更新时,才应该进行转换 在使用批处理脚本时,我是一个初学者,但在对如何比较文件修改时间进行了一些搜索之后,我找到了以下my_convert.bat文件: 然而,这是行不通的。它循环遍历我的目录中的所有文件,但始终显示目录中的最后一个文件是“最近修改的文件”。很明显,我对我实现的逻辑权利有些不理解。如果您能帮我找到正确的方向,我将不胜感激。,我将您的评论总结成一个答案,主要是为了从未回答的问题列表中获取这个问题,同时还添加了一些关于环境变量和FOR变量之间差异的附加信息 使用的最终工作代码为:Date 使用windows批处理脚本基于另一个文件的上次修改日期创建文件,date,batch-file,Date,Batch File,我有一个目录,其中包含*.aaa类文件,我想使用完全相同的文件名将其转换为*.bbb类文件,只有文件格式会随着Windows命令提示符中的批处理脚本而更改 由于目录中有许多文件,我不想进行不必要的转换,因此只有当file.bbb不存在,或者file.aaa比当前的file.bbb更新时,才应该进行转换 在使用批处理脚本时,我是一个初学者,但在对如何比较文件修改时间进行了一些搜索之后,我找到了以下my_convert.bat文件: 然而,这是行不通的。它循环遍历我的目录中的所有文件,但始终显示目录
SETLOCAL EnableDelayedExpansion
FOR %%i IN (*.aaa) DO (
REM Check if *.bbb already exists
SET BASENAME=%%~ni
IF EXIST "!BASENAME!.bbb" (
REM if *.bbb already exists, check if it is up to date
FOR /f %%j IN ('dir "!BASENAME!.*" /B /A-D /OD /T') DO SET LATEST=%%j
ECHO The most recently modified file is !LATEST!
IF !LATEST:~-3! == "aaa" (
REM *.bbb is out of date, do my conversion here
)
) ELSE (
REM *.bbb does not exist, do my conversion here
)
)
ENDLOCAL
正如下面的代码所示,用环境变量BASENAME替换%%~ni是不必要的
SETLOCAL EnableDelayedExpansion
FOR %%i IN (*.aaa) DO (
REM Check if *.bbb already exists
IF EXIST "%%~ni.bbb" (
REM if *.bbb already exists, check if it is up to date
FOR /f %%j IN ('dir "%%~ni.*" /B /A-D /OD /T') DO SET LATEST=%%j
ECHO The most recently modified file is !LATEST!
IF !LATEST:~-3! == "aaa" (
REM *.bbb is out of date, do my conversion here
)
) ELSE (
REM *.bbb does not exist, do my conversion here
)
)
ENDLOCAL
变量i和j的值不是环境变量。因此,在执行前解析块时,无论是否带有~n这样的修饰符,都不会用字符串替换%%i和%%j。@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
设置sourcedir=U:\sourcedir
PUSHD%sourcedir%
对于/f delims=%%a IN
“dir/b/a-d*.aaa”
做
对于/f delims=%%b IN
'dir/b/od/a-d%%~na.aaa%%~na.bbb'
DO SET convert=%%~xb
如果/我!转换NEQ.bbb ECHOCONVERT%%~na
流行音乐
后藤:EOF
您需要更改sourcedir的设置以适应您的环境
对于每个.aaa文件,列出必须存在的.aaa文件-我们刚刚检查了该文件和.bbb文件的名称部分%%~na的日期顺序/od,这样列表中的最后一个扩展名只有在它都存在并且晚于.aaa文件时才是.bbb。否则,执行转换-convert命令和文件名将显示在控制台上。如果需要全名,您可以转换%%~na.aaa。请参阅此处:使用延迟扩展存储库获取帮助@Stephan。我查看了您建议的链接,然后更新了上面的过程,如下所示:在程序开始时插入codeSETLOCAL enabledelayedexpansion,然后将codeSET BASENAME=%%~ni定义为外部codeFOR循环中的第一条语句,然后用code替换所有后续代码%%ni!BASENAME!。这似乎解决了我的问题!而且,在所有对LATEST的引用中,在设置其值之后,我将%替换为!
SETLOCAL EnableDelayedExpansion
FOR %%i IN (*.aaa) DO (
REM Check if *.bbb already exists
IF EXIST "%%~ni.bbb" (
REM if *.bbb already exists, check if it is up to date
FOR /f %%j IN ('dir "%%~ni.*" /B /A-D /OD /T') DO SET LATEST=%%j
ECHO The most recently modified file is !LATEST!
IF !LATEST:~-3! == "aaa" (
REM *.bbb is out of date, do my conversion here
)
) ELSE (
REM *.bbb does not exist, do my conversion here
)
)
ENDLOCAL