1

У меня есть скрипт, который переименовывает файлы, добавляя метку времени в качестве префикса к текущему имени файла. Файл с отметкой времени выглядит так:

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 ответ1

2
@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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .