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

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

Stalker_AleX333 28-07-2017 19:23 2754676

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

Код:

    Папка 1      |      Папка 2
  старое имя:          новое имя:
fbr\fbr_linoleum    = floor\floor_floor1
crete\crete_bordur  = crete\crete_border2
crete\crete_stolb_a  = crete\crete_stolb
crete\crete_dirty_gr = crete\crete_floor3
и т.п.

Произвести пакетное переименование файлов. При условии, что по указанному пути в папке 1 есть файлы с указанными именами - переместить их в папку 2, переименовав согласно списку.

Вот как и в каком виде этот список прикурутить (желательно из внешнего файла) к cmd-шнику?

Iska 28-07-2017 19:33 2754678

  1. Как, чем готовится/будет готовиться этот список?
  2. Что делать, если в результате переименования окажется, что файл с таким именем уже существует?

Stalker_AleX333 31-07-2017 18:57 2755245

1. Список соответствий файлов по именам уже подготовлен в виде txt файла.
2. Не окажется. В первой папке таких имен быть не может. Вторая папка пуста, в нее же будут перемещаться файлы согласно списку и структуре. Хотя, простенькую защиту можно состряпать. Совпадает имя - не переименовываем, ошибку пишем в консоль и идем дальше.

Iska 31-07-2017 22:41 2755286

Цитата:

Цитата Stalker_AleX333
1. Список соответствий файлов по именам уже подготовлен в виде txt файла. »

Выкладывайте образец такого файла, упакованного в архив. И Вы ответили на другой вопрос. Свой же повторю, акцентировав:
Цитата:

Цитата Iska
Как, чем готовится/будет готовиться этот список? »

Программным образом готовится, неким приложением, ручками?

megaloman 01-08-2017 15:09 2755409

Цитата:

Цитата Iska
Выкладывайте образец такого файла, упакованного в архив »

Если файл того вида, что как я понимаю
Код:

fbr\fbr_linoleum    = floor\floor_floor1 
crete\crete_bordur  = crete\crete_border2 
crete\crete_stolb_a  = crete\crete_stolb 
crete\crete_dirty_gr = crete\crete_floor3

то вот вариант
Код:

@Echo Off
cls

Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Spisok=Z:\Box_In\список переименования.txt"

FOR /F "usebackq tokens=1,2 delims==" %%i IN ("%Spisok%") DO If Not "%%j"=="" Call :ReMove "%%i"  "%%j"
pause
GoTo :Eof

:ReMove
        Call :Space "File1" %1
        Call :Space "File2" %2
        Set Action=Move "%BoxIn%\%File1%" "%BoxOut%\%File2%"
        Call :MakeDir "%BoxOut%\%File2%"
        If Not Exist "%BoxOut%\%File2%" (
                %Action% >nul || (Echo %Action% &Echo:)
        ) Else (
                Echo %Action% & Echo File Exist "%BoxOut%\%File2%"  &Echo:
        )
GoTo :Eof

:Space
        Set "TMPbegin=%~2"
        :Begin
        Set "TMPname=%TMPbegin%"
        If "%TMPbegin:~0,1%"==" " Set "TMPbegin=%TMPbegin:~1,999%"
        If "%TMPbegin:~-1%"==" " Set "TMPbegin=%TMPbegin:~0,-1%"
        If Not "%TMPbegin%"=="%TMPname%" GoTo :Begin
        Set "%~1=%TMPname%"
GoTo :Eof

:MakeDir
        If Not Exist "%~dp1" Md "%~dp1"
GoTo :Eof

Если файл того вида, что в вопросе, например
Код:

Z:\Box_In          |    Z:\Box_Out\ 
  старое имя:          новое имя:
fbr\fbr_linoleum    = floor\floor_floor1 
crete\crete_bordur  = crete\crete_border2 
crete\crete_stolb_a  = crete\crete_stolb 
crete\crete_dirty_gr = crete\crete_floor3   
и т.п.

то вот вариант
Код:

@Echo Off
cls

Set "Spisok=Z:\Box_In\список переименования.txt"

FOR /F "usebackq tokens=1,2 delims=|" %%i IN ("%Spisok%") DO If Not "%%j"=="" (
        Call :Space "BoxIn" "%%i"
        Call :Space "BoxOut" "%%j"
        GoTo :Continue
)
Echo OutBox not defined
Pause
GoTo :Eof

:Continue

FOR /F "usebackq tokens=1,2 delims==" %%i IN ("%Spisok%") DO If Not "%%j"=="" Call :ReMove "%%i"  "%%j"
pause
GoTo :Eof

:ReMove
        Call :Space "File1" %1
        Call :Space "File2" %2
        Set Action=Move "%BoxIn%\%File1%" "%BoxOut%\%File2%"
        Call :MakeDir "%BoxOut%\%File2%"
        If Not Exist "%BoxOut%\%File2%" (
                %Action% >nul || (Echo %Action% &Echo:)
        ) Else (
                Echo %Action% & Echo File Exist "%BoxOut%\%File2%"  &Echo:
        )
GoTo :Eof

:Space
        Set "TMPbegin=%~2"
        :Begin
        Set "TMPname=%TMPbegin%"
        If "%TMPbegin:~0,1%"==" " Set "TMPbegin=%TMPbegin:~1,999%"
        If "%TMPbegin:~-1%"==" " Set "TMPbegin=%TMPbegin:~0,-1%"
        If Not "%TMPbegin%"=="%TMPname%" GoTo :Begin
        If "%TMPname:~-1%"=="\" Set "TMPname=%TMPname:~0,-1%"
        Set "%~1=%TMPname%"
GoTo :Eof

:MakeDir
        If Not Exist "%~dp1" Md "%~dp1"
GoTo :Eof


alpap 01-08-2017 17:28 2755446

Stalker_AleX333,
если делать правильно, то содержимое "file.txt" должно выглядеть так:
Код:

crete_bordur=crete_border2 
crete_stolb_a=crete_stolb 
crete_dirty_gr=crete_floor3

и при структуре входа такой:
Код:

Структура папок
C:\ПАПКА 1
└───crete
        crete_bordur.txt
        crete_dirty_gr.txt
        crete_stolb_a.txt

будет работать как надо такой код:
Код:

@echo off
set "d1=C:\Папка 1\crete"
set "d2=C:\Папка 2\crete"
set "f=file.txt"
<"%f%" (for /f "tokens=1* delims==" %%a in ('find /v ""') do @(
  if not exist "%d2%" md "%d2%"
  if exist "%d1%\%%a.txt" move "%d1%\%%a.txt" "%d2%\%%b.txt"
 )
)
pause



Время: 23:52.

Время: 23:52.
© OSzone.net 2001-