2015-03-20 3 views
0

Попытка организовать показы * .nfo файлов, чтобы они имели то же имя, что и mkv (Edit: avi woops на самом деле не меняют код), которые они соответствуют.Переименование файлов * .nfo в соответствии с их * .mkv's

Test Folder: 
76107.2.1.nfo 
76107.2.2.nfo 
76107.2.3.nfo 
Doctor Who - S02E01 (009) - Planet of Giants (1) - Planet of Giants.avi 
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.avi 
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.avi 

Теперь число эпизодов в 76107.2. *. NFO неверны в более поздних папках схожесть в папке тест только потому, что это первый в сезоне. поэтому я не могу просто сравнивать имена для их соответствия, но они находятся в правильном порядке, поэтому я пытаюсь использовать счетчики, чтобы переименовать первый * .nfo так же, как и первый * .avi, а затем второй * .nfo. то же, что и второй * .avi и так далее!

Я сделал сценарий, который, как я думал, должен работать, но он ничего не делает. Любая помощь приветствуется! Редактировать Теперь он работает благодаря Aacini, за исключением странной ошибки, отмеченной в коде.

@echo on 
setlocal enableDelayedExpansion 

set cnta=0 
Set cntb=0 
for %%b in (*.avi) do (
set /a cnta=cnta+1 
set line_!cnta!=%%~Nb 
) 

for %%c in (*.nfo) do (
set /a cntb=cntb+1 
for %%i in (!cntb!) do ren "%%~fc" "!line_%%i!.nfo" 
) 

Ошибка: первое nfo, похоже, попало в конец списка, но его место все еще сохраняется. Как и в любом другом nfo, имя соответствует соответствующему avi.

Test 1 (Original Test Folder) Results: 
.nfo 
Doctor Who - S02E01 (009) - Planet of Giants (1) - Planet of Giants.avi 
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.avi 
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.nfo 
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.avi 
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.nfo 

Test 2 (Added Extra Bonus File) Results: 
Doctor Who - S02E01 (009) - Planet of Giants (1) - Planet of Giants.avi 
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.avi 
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.nfo 
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.avi 
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.nfo 
Doctor Who - S02E01 (009) - Planet of Giants (4) - The Making of Planet of Giants.avi 
Doctor Who - S02E01 (009) - Planet of Giants (4) - The Making of Planet of Giants.nfo 

Некоторые папки будут содержать бонусные видео в конце списка, которые не имеют соответствие NFO, но они всегда в конце. Я прочитал nfo, чтобы проверить только «.nfo» (Test 1)/«Doctor Who - S02E01 (009) -« Планета гигантов »(4) -« Создание планеты гигантов »(тест 2) были неуместны, они должны были из «Доктор Кто - S02E01 (009) - Планета гигантов (1) - Планета гигантов.nfo»

+0

Возможно, вам повезет, отсортировав список файлов с помощью опций 'dir'. Но я не знаю, если у вас возникнут проблемы с пространственным пространством с длинным списком переменных. – shawnt00

+0

Вам также необходимо двойное расширение переменных во втором цикле.Возможно, это поможет: http://stackoverflow.com/questions/1199931/how-expand-a-cmd-shell-variable-twice-recursive – shawnt00

+0

Это, вероятно, лучшая ссылка: http://stackoverflow.com/questions/ 7882395/why-is-delayed-expand-in-a-batch-file-not-working-in-this-case – shawnt00

ответ

2

Правильный термин для обозначения ваших переменных line_!cnta!: массив. Вы можете просмотреть полное описание управления массивами в пакетных файлах по адресу this post. Например, код может быть закреплен таким образом:

EDIT: небольшой ошибки фиксированной

@echo on 
setlocal enableDelayedExpansion 

set cnta=0 
Set cntb=0 

for %%b in (*.mkv) do (
set /a cnta=cnta+1 
set line_!cnta!=%%~Nb 
) 

for /F "delims=" %%c in ('dir /B *.nfo') do (
set /a cntb=cntb+1 
for %%i in (!cntb!) do ren "%%~fc" "!line_%%i!.nfo" 
) 
+0

Я бы сказал, что лучшее имя будет «array-like», поскольку оно не является истинным массивом. Это то же самое, что разница между папкой, содержащей кучу файлов, и архивом, содержащим те же файлы, которые не используют никакого сжатия. – SomethingDark

+0

@ Dracrius: Извините, но логика переименования - это то же самое, что вы опубликовали в своем вопросе; Я просто установил точку доступа к элементам массива. Если вы хотите, чтобы мы также исправили логику переименования, вы должны опубликовать список файлов, которые вызывают ошибку и желаемый результат. Пожалуйста, отредактируйте свой _question_ и поместите список имен внутри тега кода, НЕ публикуйте список имен здесь, в комментариях ... – Aacini

+0

@SomethingDark: Я не согласен. Массив - это _data structure_: переменная, состоящая из ряда элементов, к которым обращаются через числовой индекс или индекс. Если определенные данные используют эту структуру, это массив; если нет, то нет. Для управления массивом вам не нужен определенный язык программирования или определенная нотация (даже и компьютер!). – Aacini

1

Я думаю, что это сработает для вас. Вы должны изменить echo ren на ren, как только вы решите, что он выглядит правильно.

@echo on 
setlocal enableDelayedExpansion 

set cnta=0 
set cntb=0 

for %%a in (*.mkv) do (
    set /a cnta=cnta+1 
    set line_!cnta!=%%a 
) 

for %%b in (*.nfo) do (
    set /a cntb=cntb+1 
    set newname=line_!cntb! 
    call set newname=%%!newname!%% 
    echo ren "%%~fb" "!newname!" 
) 

Я думаю, вы предпочтете такую ​​петлю. Я тестировал все это на этот раз:

@echo on 
setlocal enableDelayedExpansion 

set cnta=0 
set cntb=0 

for /f "usebackq delims=" %%a in (`dir *.mkv /a-d /b /on`) do (
    set /a cnta=cnta+1 
    set line_!cnta!=%%a 
) 

for /f "usebackq delims=" %%b in (`dir *.nfo /a-d /b /on`) do (
    set /a cntb=cntb+1 
    set newname=line_!cntb! 
    call set newname=%%!newname!%% 
    echo ren "%%~fb" "!newname!" 
) 

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

+0

Это все равно ничего не делает. Спасибо за то, что он выглядит лучше, чем мой, но он даже не будет эхом! – Dracrius

+0

Вы использовали 'for/f', когда вы действительно хотите' for', хотя я думаю, что вы все равно захотите использовать эту опцию с помощью команды 'dir'. Я отредактировал ответ. – shawnt00

+0

Почему версия dir будет лучше? И я сожалею, что он все еще ничего не делает. – Dracrius

1

Так как вы, кажется, ищете альтернативу, делает каждый .nfo файл содержит имя его соответствующий файл .mkv? Если это так, вы можете использовать find и условное выполнение для сопряжения .mkv с его .nfo содержимым .nfo. Это много (much!) менее эффективен, чем ответы Шон и Ачини, но по крайней мере вам не нужно беспокоиться о том, будут ли файлы в порядке.

@echo off 
setlocal 

for %%I in (*.mkv) do (
    for %%x in (76107*.nfo) do if not exist "%%~nI.nfo" (
     find /i "%%~nxI" "%%x" >NUL && ren "%%x" "%%~nI.nfo" 
    ) 
) 
Смежные вопросы