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

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

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

Затем я вытащил отчет в 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, который я могу использовать для автоматического добавления информации об изменении даты в имя файла?

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

2
задан 13 May 2016 в 22:16
2 ответа

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

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

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

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

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

Поскольку мы находимся в цикле for, нам нужно изменить способ адресации varables (которые основаны на том, что вы уже написали). Меняем% на! для имен переменных внутри цикла. Итак, если у вас есть имя переменной 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!"
    copy %%F %%~dpnF_!ParsedDate!%%~xF.new )

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

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

exit
2
ответ дан 3 December 2019 в 11:32

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

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

Объяснение:

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

Теги

Похожие вопросы