Компьютерный форум 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=349536)

sdml 04-09-2021 12:13 2965811

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

alpap 04-09-2021 13:30 2965816

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

sdml 04-09-2021 13:50 2965818

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

alpap 04-09-2021 13:53 2965819

дело ваше:
Код:

@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


Iska 04-09-2021 14:38 2965825

На 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 2965832

Еще вариант
Код:

@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


sdml 04-09-2021 16:03 2965836

Предложенный 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 - вроде ОК. Как тут хитро с массивами сделано...

alpap 04-09-2021 19:33 2965852

Цитата:

Цитата sdml
если в именах есть квадратные скобки »

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

megaloman 04-09-2021 23:39 2965864

Цитата:

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

Цитата:

Цитата кто-то из древних корифеев, не помню кто
Всегда можно подобрать данные, способные одурачить любую программу

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

Iska 05-09-2021 00:18 2965867

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

alpap 05-09-2021 01:17 2965868

Цитата:

Цитата Iska
а 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])"
}


Iska 05-09-2021 02:02 2965870

alpap, в коде не учтено:
  • различное количество групп файлов *.ass и *.mkv;
  • в выборку попадают и файлы с расширениями, начинающимися на «ass» и «mkv» (привет коротким именам формата 8.3);
  • квадратные скобки в именах файлов — опять беда-печаль.
;). Из плюсов — нет проблемы с возможной двойной обработкой одного и того же файла после переименования (поскольку весь перечень искомых файлов получается целиком изначально).

P.S. Переименование нужно в обратную сторону — *.ass файлов на основе *.mkv имён ;).

alpap 05-09-2021 19:26 2965921

Цитата:

Цитата Iska
квадратные скобки в именах файлов »

нет, здесь это никак не влияет на работу
Цитата:

Цитата Iska
различное количество групп файлов *.ass и *.mkv »

будет выдана ошибка (при этом переименование произойдет) только в случае если файлов которые надо переименовать меньше чем тех из которых берем имя, если наоборот больше - переименуется сколько есть.
Цитата:

Цитата Iska
в выборку попадают и ...»

это легко отрегулировать если надо, но редко требуется, вряд ли для этой задачи

Iska 05-09-2021 20:32 2965930

Цитата:

Цитата alpap
нет, здесь это никак не влияет на работу »

Скрытый текст
Код:

╔══════════════ 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


Цитата:

Цитата alpap
будет выдана ошибка (при этом переименование произойдет) только в случае если файлов которые надо переименовать меньше чем тех из которых берем имя, »

Я именно про это.

Цитата:

Цитата alpap
это легко отрегулировать если надо, но редко требуется, вряд ли для этой задачи »

Ну, я ж про перфекционизьм :).

alpap 06-09-2021 13:26 2965993

Цитата:

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


все без ошибок и как надо.

Iska 06-09-2021 20:32 2966025

alpap, возможно это:
Цитата:

Цитата alpap
pwsh 7.1.4 »

У меня 5.1 на Windows 7 SP1 x64.

Дай-то бог.


Время: 23:43.

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