Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Пакетное переименование файлов на основе заданного списка

Ответить
Настройки темы
CMD/BAT - Пакетное переименование файлов на основе заданного списка
Stalker_AleX333


Сообщения: n/a

Профиль | Цитировать


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

Код: Выделить весь код
    Папка 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-шнику?

Отправлено: 19:23, 28-07-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:33, 28-07-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

Stalker_AleX333


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 18:57, 31-07-2017 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Stalker_AleX333:
1. Список соответствий файлов по именам уже подготовлен в виде txt файла. »
Выкладывайте образец такого файла, упакованного в архив. И Вы ответили на другой вопрос. Свой же повторю, акцентировав:
Цитата Iska:
Как, чем готовится/будет готовиться этот список? »
Программным образом готовится, неким приложением, ручками?

Отправлено: 22:41, 31-07-2017 | #4


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата 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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 02-08-2017 в 13:55. Причина: Добавил вариант решения


Отправлено: 15:09, 01-08-2017 | #5


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:28, 01-08-2017 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Пакетное переименование файлов на основе заданного списка

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Пакетное переименование файлов в случайное имя brosafari Скриптовые языки администрирования Windows 3 17-01-2017 21:29
CMD/BAT - Пакетное переименование файлов по маске Viktor99 Скриптовые языки администрирования Windows 1 15-08-2016 23:25
CMD/BAT - [решено] Пакетное переименование файлов ArsenBespalov Скриптовые языки администрирования Windows 9 11-08-2016 03:56
VBS/WSH/JS - Создание группы файлов Excel на основе списка Serg2010 Скриптовые языки администрирования Windows 4 23-03-2013 00:43
Создание группы файлов Excel на основе списка Serg2010 AutoIt 1 19-03-2013 05:43




 
Переход