我有一个脚本,它通过在当前文件名中添加时间戳作为前缀来重命名文件。带有时间戳的文件如下所示:
20170407_1030.file1.txt
我在处理完一些文件后在文件夹中运行此脚本。问题是,一旦文件的名称中已经添加了时间戳,下次我运行脚本时,它会在文件名中添加另一个时间戳。相反,如果文件的名称中已经添加了时间戳,我希望代替并附有更新的时间戳。
为了实现这一点,我尝试识别已经包含时间戳的文件名,如果是,则用更新的时间戳替换它。
我执行此操作的脚本目前如下所示:
setlocal enabledelayedexpansion
for /f "delims=|" %%F in ('dir /b %cd%\*.*') do (
set "MDate=%%~tF"
set "Patern=*_*."
set "TimeStamp=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
ren "%%~nF%%~xF" "!TimeStamp!-%%~nF%%~xF"
)
exit
编辑:抱歉没有提供更多详细信息。我做了一些研究,但找不到匹配给定样本中的掩码的方法。我知道如何替换预定义模式或如何匹配掩码,例如ren *.png *.jpg
。
答案1
@Echo off
Pushd "X:\path\to\workdir"
:: Get current date time
For /f "delims=." %%A in (
'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set DT=%%A
Set "DT=%DT:~0,8%_%DT:~8,4%"
For /f "tokens=1* delims=." %%A in (
'Dir /B/A-D "20*_*.*.txt"^|findstr "^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\." '
) do Echo ren "%%A.%%B" "%DT%.%%B"
如果输出看起来正常,请删除最后一行的回声。
示例输出:
> SU_1225592.cmd
ren "20170704_1656.File1.txt" "20170704_1700.File1.txt"
ren "20170704_1656.File2.txt" "20170704_1700.File2.txt"
编辑要仅检查文件中是否存在 date_time 模式,
您可以使用此批处理,它仅使用从 findstr 返回的错误级别
来有条件地执行成功&&
或失败的||
不同命令。
@Echo off
Set "Pattern=^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\."
For %%A in ("%CD%\*") Do Echo:%%~nA|findstr "%Pattern%">NUL 2>&1 && (
Echo found Pattern in %%~fA
) || (
Echo No Pattern in %%~fA
)
示例输出:
No Pattern in A:\Copy+Archive.cmd
No Pattern in A:\SU_1225592.cmd
found Pattern in A:\20170704_1656.File1.txt
found Pattern in A:\20170704_1656.File2.txt
No Pattern in A:\tp010387.BAT