Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 使用windows批处理脚本基于另一个文件的上次修改日期创建文件_Date_Batch File - Fatal编程技术网

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

Date 使用windows批处理脚本基于另一个文件的上次修改日期创建文件,date,batch-file,Date,Batch File,我有一个目录,其中包含*.aaa类文件,我想使用完全相同的文件名将其转换为*.bbb类文件,只有文件格式会随着Windows命令提示符中的批处理脚本而更改 由于目录中有许多文件,我不想进行不必要的转换,因此只有当file.bbb不存在,或者file.aaa比当前的file.bbb更新时,才应该进行转换 在使用批处理脚本时,我是一个初学者,但在对如何比较文件修改时间进行了一些搜索之后,我找到了以下my_convert.bat文件: 然而,这是行不通的。它循环遍历我的目录中的所有文件,但始终显示目录

我有一个目录,其中包含*.aaa类文件,我想使用完全相同的文件名将其转换为*.bbb类文件,只有文件格式会随着Windows命令提示符中的批处理脚本而更改

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

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

然而,这是行不通的。它循环遍历我的目录中的所有文件,但始终显示目录中的最后一个文件是“最近修改的文件”。很明显,我对我实现的逻辑权利有些不理解。如果您能帮我找到正确的方向,我将不胜感激。

,我将您的评论总结成一个答案,主要是为了从未回答的问题列表中获取这个问题,同时还添加了一些关于环境变量和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
正如下面的代码所示,用环境变量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