Показать полную графическую версию : [решено] Переименовать файлы одного типа также как файлы другого типа
For n от 1 и до конца каталога берем n-й файл ass и переименовываем так же как n-й файл mkv
Но вот как это сделать в батнике так и не придумал.
но в зависимости от имени ass, т.е. сортировки, не будет четкого соответствия одного файла другому в отношении просто очередности, по сути это рандом, при смене имени в другой раз это будет уже не тот файл по списку.
тут нужен или дополнительный файл или переменные для алгоритма переименования или таблица с соответствием по какому-то критерию что по сути то же, тогда это будет правильно.
Сколь раз делал что-то подобное всегда все нормально было. Происходит сортировка по имени, как она может быть разная?
дело ваше:
@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
На 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
megaloman
04-09-2021, 15:51
Еще вариант@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
Предложенный 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 - вроде ОК. Как тут хитро с массивами сделано...
если в именах есть квадратные скобки »
угу, это надо было уточнить, cmd не без подвоха и имеет много нюансов влияющих на конечный результат.
megaloman
04-09-2021, 23:39
это надо было уточнить, cmd не без подвоха и имеет много нюансов влияющих на конечный результат. »Всегда можно подобрать данные, способные одурачить любую программуНапример, SETLOCAL EnableDelayedExpansion приведет к ошибкам при наличии в имени файла ! Знака. Часто убеждаюсь, что иной раз надежнее при всяких копированиях/переименованиях прописывать chcp 1251 - меньшее количество символов, на которых батник не отработает. При этом возможны проблемы с xcopy и каким-то из find.
Имхо, надо понимать, где шагаешь, чтобы не втоптаться. Постановка ...
megaloman, отчасти потому я по-прежнему предпочитаю WSH: на порядок меньше шансов, что что-то где-то когда-то «рванёт» из-за того, что на пакетных файлах вообще нет строк, а PowerShell пользует С-шную логику для строк.
а PowerShell »
а тут куда как все проще
$dir = 'C:\d'
$ass = gci $dir *.ass
$mkv = gci $dir *.mkv
for ($n=0; $n -lt $ass.Count; $n++) {
rni "$($mkv.FullName[$n])" "$($ass.BaseName[$n]+$mkv.Extension[$n])"
}
alpap, в коде не учтено:
различное количество групп файлов *.ass и *.mkv;
в выборку попадают и файлы с расширениями, начинающимися на «ass» и «mkv» (привет коротким именам формата 8.3);
квадратные скобки в именах файлов — опять беда-печаль.
;). Из плюсов — нет проблемы с возможной двойной обработкой одного и того же файла после переименования (поскольку весь перечень искомых файлов получается целиком изначально).
P.S. Переименование нужно в обратную сторону — *.ass файлов на основе *.mkv имён ;).
квадратные скобки в именах файлов »
нет, здесь это никак не влияет на работу
различное количество групп файлов *.ass и *.mkv »
будет выдана ошибка (при этом переименование произойдет) только в случае если файлов которые надо переименовать меньше чем тех из которых берем имя, если наоборот больше - переименуется сколько есть.
в выборку попадают и ...»
это легко отрегулировать если надо, но редко требуется, вряд ли для этой задачи
нет, здесь это никак не влияет на работу »
╔══════════════ C:\Мои проекты\0351\0004 ════════╤═════╗
║и Имя │Размер│ Дата │Время║
║┐.. │ Вверх│05.09.21│20:29║
║ 162[52555]736600 ass│ 0│04.09.21│13:41║
║҉16247309700360 mkv│ 0│04.09.21│13:40║
║҉16252303845020 mkv│ 0│04.09.21│13:40║
║҉16252328137960 mkv│ 0│04.09.21│13:40║
║ 16252540547300 ass│ 0│04.09.21│13:41║
║ │ │ │ ║
║ │ │ │ ║
$dir = 'C:\Мои проекты\0351\0004'
$ass = gci $dir *.ass
$mkv = gci $dir *.mkv
for ($n=0; $n -lt $ass.Count; $n++) {
rni "$($ass.FullName[$n])" "$($mkv.BaseName[$n]+$ass.Extension[$n])"
}
rni : Cannot rename because item at 'C:\Мои проекты\0351\0004\162[52555]736600.ass' does not exist.
At line:7 char:3
+ rni "$($ass.FullName[$n])" "$($mkv.BaseName[$n]+$ass.Extension[$n]) ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
будет выдана ошибка (при этом переименование произойдет) только в случае если файлов которые надо переименовать меньше чем тех из которых берем имя, »
Я именно про это.
это легко отрегулировать если надо, но редко требуется, вряд ли для этой задачи »
Ну, я ж про перфекционизьм :).
rni : Cannot rename because item at 'C:\Мои проекты\0351\0004\162[52555]736600.ass' does not exist »
а вот это странно
у меня на win 10 pwsh 7.1.4 тут без ошибок
Ваш вариант имен
до
C:\D
16247309700360.mkv
16252303845020.mkv
16252328137960.mkv
16252540547300.ass
162[52555]736600.ass
после
C:\D
16247309700360.ass
16247309700360.mkv
16252303845020.ass
16252303845020.mkv
16252328137960.mkv
---
и наоборот, скобки с "той стороны"
до
C:\D
1624[730970]0360.mkv
16252303845020.mkv
16252328137960.mkv
16252540547300.ass
16252555736600.ass
после
C:\D
1624[730970]0360.ass
1624[730970]0360.mkv
16252303845020.ass
16252303845020.mkv
16252328137960.mkv
все без ошибок и как надо.
alpap, возможно это:
pwsh 7.1.4 »
У меня 5.1 на Windows 7 SP1 x64.
Дай-то бог.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.