我有一个带有类型* .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
)
)
然而,这不起作用。它遍历我目录中的所有文件,但始终显示目录中的最后一个文件是最近修改过的文件'。我显然不了解我实现的逻辑权利。任何帮助引导我朝着正确方向前进的帮助都将非常感激。
答案 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
变量i
和j
是非环境变量。因此,%%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
。