PDA

Показать полную графическую версию : [решено] Переименование с условием bat


alado
12-07-2017, 22:40
Подскажите возможно ли реализовать следующий скрипт на bat/cmd???

Есть файл вида номер_годмесяцдень (00000001_20170712.pdf) а его нужно переименовать в номер_день.месяц.год (00000001_12.07.2017.pdf)

mwz
12-07-2017, 22:47
alado, на всякий случай: знак подчёркивания, как я понял, обязательно есть — причём единственный?

Busla
12-07-2017, 23:58
я бы попробовал объяснить заказчику, что это плохая идея - что точки в имени файла, что национальный формат даты, что порядок номера и даты

mwz
13-07-2017, 01:35
Busla, угу, в идеале — ГодМесяцДень_НомерФайла.pdf
Но это понимание обычно приходит с опытом, после того как намучаешься с "интуитивно понятными" вариантами. А пока сам не прочувствовал — убедить начальство или заказчика, задавшего такие требования, нереально.

Iska
13-07-2017, 03:59
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFilePath=%~1
set sSourceFileName=%~nx1

if defined sSourceFilePath (
if exist "%sSourceFilePath%" (
set sLastPart=%sSourceFileName:*_=%
call set sFirstPart=%%sSourceFileName:!sLastPart!=%%

set sYear=!sLastPart:~0,4!
set sMonth=!sLastPart:~4,2!
set sDay=!sLastPart:~6,2!
set sExt=!sLastPart:~8!

set sNewFileName=!sFirstPart!!sDay!.!sMonth!.!sYear!!sExt!

echo Rename [%sSourceFilePath%] into [!sNewFileName!]
ren "%sSourceFilePath%" "!sNewFileName!"
) else (
echo Can't find source file [%sSourceFilePath%].
exit /b 2
)
) else (
echo Usage: %~0 ^<Source file^>
exit /b 1
)

endlocal
exit /b 0

Путь к целевому файлу указывается параметром пакетного файла. Также можно просто перетащить целевой файл на пакетный файл в Проводнике.

megaloman
13-07-2017, 13:05
я бы попробовал объяснить заказчику » Программы пишутся для клиента, конечно, с клиентом надо работать, но если для него главное - номер файла, то дата - это как комментарий. Кто девушку ужинает, тот её и танцует.
@Echo Off
Call :RenMask "%~1"
GoTo :Eof

:RenMask
If "%~1"=="" Echo No arguments for CMD-file "%~dpnx0"& GoTo :Eof
If Not Exist "%~1" Echo File "%~1" Not Found& GoTo :Eof

Set "FMask=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_20[0-9][0-9][0-1][0-9][0-3][0-9]\.pdf"

Set "FName=%~nx1"
Set "NewName=%FName:~0,9%%FName:~15,2%.%FName:~13,2%.%FName:~9,4%%FName:~17,4%"
Echo %FName%| Findstr.exe /R /B /I "%FMask%" >nul&& Ren "%~1" "%NewName%"|| Echo File name "%~1" incorrect
GoTo :Eof
Путь к целевому файлу указывается параметром пакетного файла. Также можно просто перетащить целевой файл на пакетный файл в Проводнике.@Echo Off
cls
Set "FileIn=Z:\Box_In\Тра ля ля\????????_20??????.pdf"

FOR %%f IN ("%FileIn%") DO Call :RenMask "%%~f"
pause
GoTo :Eof

:RenMask
If "%~1"=="" Echo No arguments for CMD-file "%~dpnx0"& GoTo :Eof
If Not Exist "%~1" Echo File "%~1" Not Found& GoTo :Eof

Set "FMask=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_20[0-9][0-9][0-1][0-9][0-3][0-9]\.pdf"

Set "FName=%~nx1"
Set "NewName=%FName:~0,9%%FName:~15,2%.%FName:~13,2%.%FName:~9,4%%FName:~17,4%"
Echo %FName%| Findstr.exe /R /B /I "%FMask%" >nul&& Ren "%~1" "%NewName%"|| Echo File name "%~1" incorrect
GoTo :Eof
Маска файлов с путём к папке указывается явно в скрипте в переменной FileIn. Можно, конечно, сделать так, чтобы работало при перетаскивании имени папки на батник, но я не сделал, посчитал, что это одна специфическая папка. Скрипт можно выполнять многократно - входной контроль не позволит переименовать уже переименованные файлы.Возможно, я переусложнил задачу :maniac:

mwz
13-07-2017, 23:18
Если протелепатить »

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

Но за сутки вопрошающий ни разу не появился, и даже на уточняющий вопрос не ответил.

Iska
13-07-2017, 23:37
Но за сутки вопрошающий ни разу не появился »
Ждём ещё через пару лет с новым вопросом :lol:.

alado
14-07-2017, 19:27
Iska, спасибо, опробовал. Все работает!

megaloman, но Ваше решение оказалось тем самым.

Согласен что не полностью дал понять что требуется, но скажу одно ВЫРУЧИЛИ!




© OSzone.net 2001-2012