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

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

Ответить
Настройки темы
CMD/BAT - [решено] Переименовать файлы одного типа также как файлы другого типа

Новый участник


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

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


For n от 1 и до конца каталога берем n-й файл ass и переименовываем так же как n-й файл mkv
Но вот как это сделать в батнике так и не придумал.

Отправлено: 12:13, 04-09-2021

 

Ветеран


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

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


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

Отправлено: 13:30, 04-09-2021 | #2



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

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


Новый участник


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

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


Сколь раз делал что-то подобное всегда все нормально было. Происходит сортировка по имени, как она может быть разная?

Отправлено: 13:50, 04-09-2021 | #3


Ветеран


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

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


дело ваше:
Код: Выделить весь код
@echo off
set "sdir=C:\d"
set "ext1=ass"
set "ext2=mkv"

cd /d "%sdir%"
for /f "tokens=1* delims=[]" %%a in ('dir /a-d/b "*.%ext1%"^|find /n /v ""') do call :#_ren "%%a" "%%b"
pause& exit

:#_ren
  for /f "tokens=1* delims=[]" %%a in ('dir /a-d/b "*.%ext2%"^|find /n /v ""^|find "%~1"') do 2>nul ren "%%b" "%~n2%%~xb"
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:53, 04-09-2021 | #4


Ветеран


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

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


На WSH:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim objFSO
Dim objFile

Dim objDictMKV
Dim objDictASS

Dim arrMKV
Dim arrASS

Dim iMaxCount
Dim i


Set objFSO     = WScript.CreateObject("Scripting.FileSystemObject")

Set objDictMKV = WScript.CreateObject("Scripting.Dictionary")
Set objDictASS = WScript.CreateObject("Scripting.Dictionary")

For Each objFile In objFSO.GetFolder(WScript.CreateObject("WScript.Shell").CurrentDirectory).Files
	Select Case objFSO.GetExtensionName(objFile.Name)
		Case "mkv"
			objDictMKV.Add objFile.Name, ""
		Case "ass"
			objDictASS.Add objFile.Name, ""
		Case Else
			' Nothing to do
	End Select
Next

If objDictMKV.Count > 0 And objDictASS.Count > 0 Then
	arrMKV = objDictMKV.Keys
	arrASS = objDictASS.Keys
	
	If objDictMKV.Count <= objDictASS.Count Then
		iMaxCount = objDictMKV.Count
	Else
		iMaxCount = objDictASS.Count
	End If
	
	For i = LBound(arrMKV) To iMaxCount - 1
		WScript.Echo "Rename file [" & arrASS(i) & "] into [" & objFSO.GetBaseName(arrMKV(i)) & "." & objFSO.GetExtensionName(arrASS(i)) & "]."
		objFSO.MoveFile arrASS(i), objFSO.GetBaseName(arrMKV(i)) & "." & objFSO.GetExtensionName(arrASS(i))
	Next
Else
	WScript.Echo "Nothing found for renaming."
	WScript.Quit 1
End If

Set objDictASS = Nothing
Set objDictMKV = Nothing

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:38, 04-09-2021 | #5


Ветеран


Contributor


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

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


Еще вариант
Код: Выделить весь код
@Echo Off
cls
	Set "File1=Z:\Box_In\*.ass"
	Set "File2=Z:\Box_In\*.mkv"

	Call :Mass "%File1%" "@ass" "N1" 
	Call :Mass "%File2%" "@mkv" "N2" 

	If Not "%N1%"=="%N2%" (Echo ??? Error!!!  N1=%N1%^<^>%N2%=N2 &Pause &Exit /B 2)
	For /L %%i In (1,1,%N1%) Do Call :MyRen "%%@ass%%i%%" "%%@mkv%%i%%"
pause
Exit /B 0

:Mass
	Set /A @N=0
	For /F "usebackq delims=" %%f In (`2^>nul Dir %1 /B /A:-D /O:N`) Do Set /A @N+=1 &Call Set "%~2%%@N%%=%~dp1%%f"
	Set /A %~3=%@N%
Exit /B

:MyRen
	Ren %1 "%~n2%~x1"
Exit /B

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:51, 04-09-2021 | #6


Новый участник


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

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


Предложенный alpap вариант не работает, если в именах есть квадратные скобки и собственно переименование по-моему не в ту сторону. Но на основе его варианта сделал свой велосипед.
Код: Выделить весь код
@echo off
SETLOCAL EnableDelayedExpansion
set /a i = 0
for %%a in (*.ass) do (
set /a i += 1
call :#_ren !i! "%%a"
)

:#_ren
set /a j = 0
for %%b in (*.mkv) do (
set /a j += 1
if !j! equ %1 (
ren %2 "%%~nb%~x2"
exit /b
)
)
Все отрабатывает как надо, только 1й цикл почему то заходит на 2й круг когда уже все переименовано и все это завершается сообщением об ошибке.
Потестил вариант megaloman - вроде ОК. Как тут хитро с массивами сделано...

Последний раз редактировалось sdml, 04-09-2021 в 16:49. Причина: upd


Отправлено: 16:03, 04-09-2021 | #7


Ветеран


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

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


Цитата sdml:
если в именах есть квадратные скобки »
угу, это надо было уточнить, cmd не без подвоха и имеет много нюансов влияющих на конечный результат.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:33, 04-09-2021 | #8


Ветеран


Contributor


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

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


Цитата alpap:
это надо было уточнить, cmd не без подвоха и имеет много нюансов влияющих на конечный результат. »
Цитата кто-то из древних корифеев, не помню кто:
Всегда можно подобрать данные, способные одурачить любую программу
Например, SETLOCAL EnableDelayedExpansion приведет к ошибкам при наличии в имени файла ! Знака. Часто убеждаюсь, что иной раз надежнее при всяких копированиях/переименованиях прописывать chcp 1251 - меньшее количество символов, на которых батник не отработает. При этом возможны проблемы с xcopy и каким-то из find.
Имхо, надо понимать, где шагаешь, чтобы не втоптаться. Постановка ...

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


Отправлено: 23:39, 04-09-2021 | #9


Ветеран


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

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


megaloman, отчасти потому я по-прежнему предпочитаю WSH: на порядок меньше шансов, что что-то где-то когда-то «рванёт» из-за того, что на пакетных файлах вообще нет строк, а PowerShell пользует С-шную логику для строк.

Отправлено: 00:18, 05-09-2021 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как удалить все файлы одного типа во всех подпапках определенной папки? popt2t Скриптовые языки администрирования Windows 3 16-02-2013 21:03
CMD/BAT - [решено] Как удалить файлы одного типа через командную строку? Raf-9600 Скриптовые языки администрирования Windows 5 01-08-2011 11:02
Разное - [решено] Как открыть файлы типа *.bkf в Windows 7? Nerde Microsoft Windows 7 10 08-07-2010 23:10
Как в домене вин 2003 запретить пользователям сохранять файлы определенного типа Russo Microsoft Windows NT/2000/2003 5 12-02-2009 10:25
как изменить права на файлы только определенного типа Guest Microsoft Windows NT/2000/2003 12 23-03-2004 10:09




 
Переход