使用Windows批处理脚本基于另一个文件的上次修改日期创建文件

时间:2014-08-22 08:38:13

标签: date batch-file

我有一个带有类型* .aaa的文件的目录,我希望在Windows命令提示符下使用批处理脚本转换为kind * .bbb(使用完全相同的文件名,只更改文件格式)。

由于目录中有很多文件,我不想进行不必要的转换,因此只有在file.bbb不存在或者file.aaa比当前文件更新时才应该这样做。 BBB

我在使用批处理脚本时相当初学者,但在对如何比较文件修改时间进行一些搜索之后,我想出了以下my_convert.bat文件:

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
    )
)

然而,这不起作用。它遍历我目录中的所有文件,但始终显示目录中的最后一个文件是最近修改过的文件'。我显然不了解我实现的逻辑权利。任何帮助引导我朝着正确方向前进的帮助都将非常感激。

2 个答案:

答案 0 :(得分:0)

jbdv,我将您的意见总结为答案,主要是从未答复的问题列表中提取此问题,但还添加了一些有关环境变量和FOR变量之间差异的其他信息。

使用的最终工作代码是:

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

嗯,如下面的代码所示,不需要用环境变量%%~ni替换BASENAME

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

FOR变量ij环境变量。因此,%%i%%j有或没有像~n这样的修饰符在执行前解析块时永远不会被字符串替换。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir"
PUSHD "%sourcedir%"
FOR /f "delims=" %%a IN (
  'dir /b /a-d *.aaa '
 ) DO (
 FOR /f "delims=" %%b IN (
   'dir /b /od /a-d "%%~na.aaa" "%%~na.bbb"'
  ) DO SET "convert=%%~xb"
 IF /i "!convert!" NEQ ".bbb" ECHO(CONVERT "%%~na"
)

POPD 

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

使用每个.aaa文件,列出.aaa(必须存在 - 我们只是检查过)和名称部分.bbb的{​​{1}}文件在日期顺序(/ od)中,只有当它存在并且晚于%%~na文件时,列表中的最后一个扩展名才为.bbb。否则,执行转换 - 转换命令和文件名将显示在控制台上。如果您需要全名,可以转换.aaa