Назад | Перейти на главную страницу

Переименуйте файлы, чтобы добавить дату изменения имени файла с помощью Windows CMD или простого .TXT

Я пытаюсь переименовать большой пакет файлов, чтобы включить даты из столбца «Дата изменения» из проводника в каждое имя файла в формате ГГГГММДД. Мне удалось сгенерировать отчет из нужной файловой папки со всеми файлами внутри, выполнив следующие действия:

  1. Щелкните папку "Советы и рекомендации".
  2. Удерживая нажатой клавишу Shift, щелкните правой кнопкой мыши папку "Советы и рекомендации".
  3. Нажмите «Открыть командное окно здесь».
  4. Тип dir>filename.txt
  5. Нажмите Enter
  6. Откройте папку «Советы и рекомендации» и найдите текстовый файл с именем, которое вы создали.

Затем я вытащил отчет в Excel в виде текстового файла с разделителями и изменил его содержимое, так что теперь в одном столбце у меня есть дата последнего изменения, а в другом - имя файла:

Дата изменена | Имя файла

09.01.2009 | ArcGIS_TT_Projection_Transformations.doc

18.02.2014 | ArcGIS_TT_Re-Projection_WMAS.docx

09.01.2009 | ArcGIS_TT_Set_Selectable_Layers.doc

09.01.2009 | ArcGIS_TT_Spatial_Join.doc

21.04.2010 | ArcGIS_TT_View_CLU_History_Layer.doc

У меня был успех только при использовании сценариев переименования, подобных следующим:

@echo off
setlocal enableDelayedExpansion
for %%F in ("ArcGIS_TT_Projections_Transformations*.txt") do (
  set "name=%%F"
  ren "!name!" "!name:ArcGIS_TT_Projections_Transformations=ArcGIS_TT_Projections_Transformations_20090109!"
)
pause

Но я стараюсь не повторять этот процесс для 61 файла. Есть ли у кого-нибудь предложение о приглашении Windows CMD или простом .txt, которое я могу использовать для более автоматического ввода информации об изменении даты в имя файла?

Спасибо за вашу помощь!

Вот код, который вам нужно использовать для итерации текстовых файлов, получения даты изменения каждого файла, копирования каждого файла с использованием даты изменения как части имени файла и удаления исходных файлов. Вы были очень близки, но вам не хватало нескольких вещей.

Чтобы получить дату изменения файла, мы можем использовать set "MDate=%%~tF".

Чтобы проанализировать дату, предоставленную set "MDate=%%~tF" вам нужно будет указать, какие части значения, хранящегося в% MDate%, вы хотите использовать в выводе. Вы можете использовать команду set "ParsedDate=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!" преобразовать вывод set "MDate=%%~tF" от ММ / ДД / ГГГГ чч: мм до ГГГГММДД.

После этого мы можем скопировать файлы в новые файлы, используя значение% ParsedDate% в имени файла.

Вы должны увидеть две копии файлов. Если вы хотите удалить исходные файлы, нам просто нужно запустить команду for %%F in ("C:\test\*.txt") do ( del %%F ). Это оставит вас с переименованными текстовыми файлами. Чтобы преобразовать .txt.new в .txt, используйте команду ren "C:\test\*.new" *..

Поскольку мы находимся в цикле for, нам нужно изменить способ обращения к переменным (который основан на том, что вы написали, и вы уже знаете). Меняем% на! для имен переменных внутри цикла. Итак, если у вас есть имя переменной example вы должны ссылаться на переменную, используя !example! внутри цикла вместо %example%.

Чтобы переменные внутри цикла работали, нам также нужно добавить команду setlocal enabledelayedexpansion перед петлей.

Это должно охватывать все. Пожалуйста, не стесняйтесь проголосовать за или отметить ответ как правильный, если это решит вашу проблему.

Полный пакетный файл представлен ниже.

setlocal enabledelayedexpansion

for %%F in ("C:\test\*.txt") do ( 
    set "MDate=%%~tF"
    set "ParsedDate=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
    REM To add time
    set "ParsedDate=!MDate:~6,4!!MDate:~3,2!!MDate:~0,2!!MDate:~11,2!!MDate:~14,2!"
    copy %%F %%~dpnF_!ParsedDate!%%~xF.new )

for %%F in ("C:\test\*.txt") do ( 
    del %%F )

ren "C:\test\*.new" *.

exit

В Powershell вы можете сделать это с помощью однострочника:

Get-ChildItem |Foreach-Object { Rename-Item $_ -NewName ("{0}-{1}{2}" -f $_.BaseName,$_.LastWriteTime.ToString('yyyyMMdd'),$_.Extension)  }

Пояснение:

  • Get-ChildItem: Получает все элементы в каталоге. Вы могли бы добавить -Recurse также получать файлы из подкаталогов
  • Foreach-объект: Запустите следующий блок кода с каждым файлом
  • $ _: Текущий повторяемый файл как объект
  • $ _. BaseName: Имя файла без расширения
  • $ _. LastWriteTime: Время последней записи как объект DateTime
    Метод .ToString() позволяет форматировать так, как вам нужно
  • $ _. Расширение: Расширение файла