Я пытаюсь переименовать большой пакет файлов, чтобы включить даты из столбца «Дата изменения» из проводника в каждое имя файла в формате ГГГГММДД. Мне удалось сгенерировать отчет из нужной файловой папки со всеми файлами внутри, выполнив следующие действия:
dir>filename.txt
Затем я вытащил отчет в 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) }
Пояснение:
-Recurse
также получать файлы из подкаталогов.ToString()
позволяет форматировать так, как вам нужно