Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование с условием bat (http://forum.oszone.net/showthread.php?t=328299)

alado 12-07-2017 22:40 2751022

Переименование с условием bat
 
Подскажите возможно ли реализовать следующий скрипт на bat/cmd???

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

mwz 12-07-2017 22:47 2751024

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

Busla 12-07-2017 23:58 2751028

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

mwz 13-07-2017 01:35 2751036

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

Iska 13-07-2017 03:59 2751040

Скрытый текст
Код:

@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 2751092

Цитата:

Цитата Busla
я бы попробовал объяснить заказчику »

Программы пишутся для клиента, конечно, с клиентом надо работать, но если для него главное - номер файла, то дата - это как комментарий. Кто девушку ужинает, тот её и танцует.
А перед тем, как переименовывать, я бы проанализировал имя файла, чтобы не исказить имя файла не соответствуещее критерию
Код:

@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 2751223

Цитата:

Цитата megaloman
Если протелепатить »

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

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

Iska 13-07-2017 23:37 2751228

Цитата:

Цитата mwz
Но за сутки вопрошающий ни разу не появился »

Ждём ещё через пару лет с новым вопросом :lol:.

alado 14-07-2017 19:27 2751437

Iska, спасибо, опробовал. Все работает!

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

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


Время: 21:19.

Время: 21:19.
© OSzone.net 2001-