Показать полную графическую версию : Пакетное переименование файлов на основе заданного списка
Stalker_AleX333
28-07-2017, 19:23
Народ, имеется набор различных файлов в папке (с подпапками). Нужно на основе примерно такого списка, вида:
Папка 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-шнику?
Как, чем готовится/будет готовиться этот список?
Что делать, если в результате переименования окажется, что файл с таким именем уже существует?
Stalker_AleX333
31-07-2017, 18:57
1. Список соответствий файлов по именам уже подготовлен в виде txt файла.
2. Не окажется. В первой папке таких имен быть не может. Вторая папка пуста, в нее же будут перемещаться файлы согласно списку и структуре. Хотя, простенькую защиту можно состряпать. Совпадает имя - не переименовываем, ошибку пишем в консоль и идем дальше.
1. Список соответствий файлов по именам уже подготовлен в виде txt файла. »
Выкладывайте образец такого файла, упакованного в архив. И Вы ответили на другой вопрос. Свой же повторю, акцентировав:
Как, чем готовится/будет готовиться этот список? »
Программным образом готовится, неким приложением, ручками?
megaloman
01-08-2017, 15:09
Выкладывайте образец такого файла, упакованного в архив » 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
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.