Показать полную графическую версию : [решено] Переименование имени файла по маске
Дмитрий_Кульгейко@vk
07-07-2016, 12:30
Здравствуйте.
Есть задача переименовать файл c именем "ma2_ГГГГМ_ДД.pdf" в "12345_5_ГГММДД"
ma2_ - постоянная
12345_5_ - постоянная
Переменные:
ГГ -год
ММ-месяц
ДД-день
Порядок переменных меняется.
Написал
@echo off
set "d=D:\Temp\"
for /f "tokens=1-5 delims=_." %%a in ('dir/a-d/b "%d%"^|findstr/irc:"\<ma2_[0-9][0-9][0-9][0-9][0-9]_[0-9][0-9].*\>"') do ren "%d%\%%a_%%b_%%c.%%d" "12345_5_%%b%%c.txt"
exit
Получил не совсем, что необходимо.
Помогите переставить переменные в нужном порядке?
Причем ММ- сделать из 1 цифры в 2 (добавить лидирующий ноль).
а год перевести из 4х значного в двух?
megaloman
07-07-2016, 13:23
Дмитрий_Кульгейко@vk, Если Вы уверены, что месяц в исходном имени занимает одну позицию, то @Echo Off
Set "Mask=ma2_?????_??.pdf"
Set "Pref=12345_5_"
Set "Where=C:\TMP"
SetLocal EnableExtensions EnableDelayedExpansion
FOR %%f IN ("%Where%\%Mask%") DO (
Set "Name=%%~nf"
Set "Name=%Pref%!Name:~6,2!0!Name:~8,1!!Name:~-2!%%~xf"
ren "%%f" "!Name!"
)
Дмитрий_Кульгейко@vk
07-07-2016, 13:42
Спасибо за оперативный ответ.
Месяц в исходном файле действительно 1 цифра, пока не дойдет дата до октября т.е. 10 - тогда будет уже 2 цифры, и все поплывет.
Получается тут надо проверить условие, если десятая цифра=1, то надо брать две цифры 10-11, а если меньше 1, то только одну.
И еще необходимо поменять расширение на txt.
megaloman
07-07-2016, 13:49
Может быть и одна, и две, и расширение можно изменить (хотя смысл этого действия от меня ускользает):@Echo Off
Set "Mask=ma2_*_??.pdf"
Set "Pref=12345_5_"
Set "Where=C:\TMP"
Set "NewExt=.txt"
SetLocal EnableExtensions EnableDelayedExpansion
FOR %%f IN ("%Where%\%Mask%") DO (
Set "Name=%%~nf"
Set "Name2=0!Name:~8,-3!"
Set "Name=%Pref%!Name:~6,2!!Name2:~-2!!Name:~-2!%NewExt%"
ren "%%f" "!Name!"
)
Дмитрий_Кульгейко@vk
07-07-2016, 14:51
Супер. Это именно то что надо.
Большущее спасибо.
Дмитрий_Кульгейко@vk
12-07-2016, 17:54
Пришло первое число и опять я попал с одной цифрой, но уже в ДД.
megaloman
12-07-2016, 18:52
Продумывать постановку надо тщательнее :)@Echo Off
Set "Mask=ma2_*_*.pdf"
Set "Pref=12345_5_"
Set "Where=D:\Delete"
Set "NewExt=.txt"
SetLocal EnableExtensions EnableDelayedExpansion
FOR %%f IN ("%Where%\%Mask%") DO (
FOR /F "usebackq tokens=2,3 delims=_" %%s IN ('%%~nf') DO Set "YYYYMM=%%s" & Set "DD=0%%t"
Set "MM=0!YYYYMM:~4,2!
move /Y "%%f" "%%~dpf%Pref%!YYYYMM:~2,2!!MM:~-2!!DD:~-2!%NewExt%""
)
Дмитрий_Кульгейко@vk
12-07-2016, 19:22
Год на выходе тоже двухзначный должен быть.
И как теперь подставить это в старую связку.
@echo off
Set "Sep===))"
Set /A NSep=4
Set "FName=c:\TEMP\ma2_*_??.pdf"
Set "Pref=12345_5_"
Set "NewExt=.txt"
SetLocal EnableExtensions EnableDelayedExpansion
For %%f IN ("%FName%") DO Call :ReLast "%%f"
GoTo :Eof
:ReLast
Del "%~1.tmp" 2>nul
Set "Str="
FOR /F "usebackq delims=" %%s IN (`type "%~1"`) DO (
If Not "!Str!"=="" >>"%~1.tmp" Echo !Str!
Set "Str=%%s"
)
If Not "!Str:~-%NSep%!"=="%Sep%" Del "%~1.tmp" 2>nul & GoTo :Eof
If "!Str:~0,-%NSep%!"=="" Del "%~1.tmp" 2>nul & GoTo :Eof
>>"%~1.tmp" Echo !Str:~0,-%NSep%!
>>"%~1.tmp" Echo !Str:~-%NSep%!
Set "Name=%~n1"
Set "Name2=0!Name:~8,-3!"
Set "Name=%Pref%!Name:~6,2!!Name2:~-2!!Name:~-2!%NewExt%"
Move /Y "%~1.tmp" "%~dp1%Name%" >nul
If Exist "%~dp1%Name%" Del "%~1"
GoTo :Eof
C годом решил так:
@Echo Off
Set "Mask=ma2_*_*.pdf"
Set "Pref=12345_5_"
Set "Where=C:\TEMP"
Set "NewExt=.txt"
SetLocal EnableExtensions EnableDelayedExpansion
FOR %%f IN ("%Where%\%Mask%") DO (
FOR /F "usebackq tokens=2,3 delims=_" %%s IN ('%%~nf') DO Set "YYYYMM=%%s" & Set "DD=0%%t"
Set "MM=0!YYYYMM:~4,2!
move /Y "%%f" "%%~dpf%Pref%!YYYYMM:~2,2!!MM:~-2!!DD:~-2!%NewExt%""
)
megaloman
12-07-2016, 19:47
Дмитрий_Кульгейко@vk, Я давно учел эту проблему в теме Поиск и замена текста в файле (http://forum.oszone.net/thread-316638.html)
Дмитрий_Кульгейко@vk
12-07-2016, 19:51
спасибо, увидел.
Дмитрий_Кульгейко@vk
12-07-2016, 20:15
Спасибо огромное за помощь.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.