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

A555555 19-09-2020 11:47 2934398

Выполнить действие для текущего файла
 
Добрый день.
Помогите пожалуйста.

Имеется BATник выполняющий функцию слияния одноименных файлов звука .m4a и видео .mp4, например луна.mp4 склеится с луна.m4a на выходе будет луна.mkv
Код:

@ECHO OFF
for %%f in ("*.mp4") do mkvmerge.exe --output "%%f.mkv" ( "%%~nf.m4a" ) --no-audio --no-subtitles --no-attachments ( "%%f" ) --track-order 1:0,0:0
:end

Для того чтоб сработало, BATник всегда лежит в папке с этими файлами.

Очень бы хотелось сделать удаленно лежащий батник, и для него ярлык положить например в папку контекстного меню "Отправить...".
Т.е. чтоб правой кнопкой например по видеосодержащему файлу .mp4 ПКМ - Отправить - Батник и пошел процесс слияния даже если батник не лежит в текущей папке.

Если я сильно много хочу, то как вариант мне также нормальным кажется временное копирование батника в папку с текущим файлом, для которого я сделал ПКМ - Отправить - БАТник.
Т.е. лежит батник с вышеуказанным кодом на диске "c:\Program Files\K-Lite Codec Pack\Filters\ffmpeg\mkv.bat"
Ярлык для него лежит в "c:\Users\Пользователь\AppData\Roaming\Microsoft\Windows\SendTo\mkv.ink"

По случайному файлу, лежащему например в D:\Temp2\луна.mp4 (само собой и аудио файл скорее всего там лежит луна.m4a), ПКМ - Отправить - Батник
- батник копирует получается сам себя mkv.bat в эту папку с файлом (папку чтоб определяло просто как текущую, а не именно D:\Temp2\)
- выполняется
- самоудаляется из текущей папки

megaloman 19-09-2020 13:41 2934402

A555555,
Код:

@Echo Off
cls
Pushd %1 ||(Echo Folder "%~1" not correct &Pause &Exit /B 2)
        CD
        for %%f in ("*.mp4") do mkvmerge.exe --output "%%f.mkv" ( "%%~nf.m4a" ) --no-audio --no-subtitles --no-attachments ( "%%f" ) --track-order 1:0,0:0
Popd
Exit /B

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

A555555 19-09-2020 14:18 2934404

megaloman
Очень круто.
Можно перетягивать папку, а можно как я и хотел через контекстное "Отправить" тоже по нужной папке.

Fors1k 20-09-2020 22:46 2934487

Цитата:

Цитата A555555
По случайному файлу, лежащему например в D:\Temp2\луна.mp4 (само собой и аудио файл скорее всего там лежит луна.m4a), ПКМ - Отправить »

Код:

Param(
    $mkvmerge = 'C:\soft\mkvmerge.exe'
)cls

reg add HKLM\SOFTWARE\Classes\*\shell\MKVmerge\command /d "powershell.exe gci *.mp4|%%{`$mkv=`$_.Name -replace'[^\.]+$', 'mkv';`$m4a=`$_.Name -replace'[^\.]+$', 'm4a';$mkvmerge --output `$mkv (`$m4a) --no-audio --no-subtitles --no-attachments (`$_.name) --track-order 1:0,0:0}" /f


A555555 20-09-2020 23:06 2934488

Вложений: 1
Fors1k
ошибка по всей видимости
http://forum.oszone.net/attachment.p...1&d=1600632291

ПКМ по mp4 файлу к которому нужно приклеить одноименную m4a, выбираю новый пункт mkvmerge в меню.

Fors1k 21-09-2020 13:06 2934526

Запустил еще раз у себя. Работает без проблем.
Покажите вывод команды:
Код:

$host.Version
И вот этой:
Код:

cls
reg query HKLM\Software\Classes\*\shell\MKVmerge\command /ve


A555555 21-09-2020 19:25 2934552

Fors1k

Цитата:

Цитата Fors1k
Покажите вывод команды: »

Код:

C:\Users\ПОЛЬЗОВАТЕЛЬ>$host.Version
"$host.Version" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.


Цитата:

Цитата Fors1k
И вот этой: »

Код:

C:\Users\ПОЛЬЗОВАТЕЛЬ>reg query HKLM\Software\Classes\*\shell\MKVmerge\command /ve

HKEY_LOCAL_MACHINE\Software\Classes\*\shell\MKVmerge\command
    (по умолчанию)    REG_SZ    powershell.exe gci *.mp4|%{`$mkv=`$_.Name -repla
ce'[^\.]+$', 'mkv';`$m4a=`$_.Name -replace'[^\.]+$', 'm4a';$mkvmerge --output `$
mkv (`$m4a) --no-audio --no-subtitles --no-attachments (`$_.name) --track-order
1:0,0:0}


Fors1k 21-09-2020 19:59 2934555

Вставьте и выполните код из моего первого сообщения в powershell, а не в cmd. Тогда все заработает. Только измените путь к mkvmerge.exe .

A555555 21-09-2020 20:45 2934560

Fors1k
Мне не хватает мозгов, чтоб вашу мысль уловить.
Мои исходные данные.
mkvmerge.exe через переменные среды системы прописан в Системные переменные строка Path. Путь там с русскими буквами и пробелами.
В вашем коде путь на свой сменил, взяв путь в обычные двухчерточные кавычки.

Запускал ваш код, и привел скрин ошибки из PowerShell. Сейчас ошибка сохраняется.

Fors1k 21-09-2020 21:32 2934564

Цитата:

Цитата A555555
Мне не хватает мозгов, чтоб вашу мысль уловить. »

Нажмите Win+R.
Напишите там powershell, нажмите Enter.
В открывшееся окно вставьте код, предварительно изменив в нем путь.
Код:

Param(
    $mkvmerge = 'C:\soft\mkvmerge.exe'
)cls

reg add HKLM\SOFTWARE\Classes\*\shell\MKVmerge\command /d "powershell.exe gci *.mp4|%%{`$mkv=`$_.Name -replace'[^\.]+$', 'mkv';`$m4a=`$_.Name -replace'[^\.]+$', 'm4a';$mkvmerge --output `$mkv (`$m4a) --no-audio --no-subtitles --no-attachments (`$_.name) --track-order 1:0,0:0}" /f

Готово, все должно работать.

A555555 21-09-2020 21:45 2934565

Вложений: 1
Fors1k
запустил PowerShell, вставил код, путь примерно следующий указав
Код:

'd:\Temp2\Windows и сеть\Windows установка\Обновления и настройки\MKV\MKVtoolnix\mkvmerge.exe'
оставил для пути только ваши скобки.

Получаю следующий результат.
http://forum.oszone.net/attachment.p...1&d=1600713934




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

for %%f in ("*.m4v","*.mp4","*.mpg","*.mpeg","*.avi","*.flv","*.webm","*.mkv","*.ts","*.m2ts") do mkvmerge.exe --output "J://%%~nf/%%f" --split size:95M ( "%%f" )
избавится от привязки к конкретной папке, чтоб например можно было через ярлык SendTo запустить на любом файле.

Fors1k 21-09-2020 23:26 2934571

Цитата:

Цитата A555555
Получаю следующий результат. »

Все, можете пользоваться.

megaloman 22-09-2020 08:43 2934580

Цитата:

Цитата A555555
помогите пожалуйста облагородить этот код, режет все файлы с соответствующими расширениями в папке откуда запускается батник. ... избавится от привязки к конкретной папке, чтоб например можно было через ярлык SendTo запустить на любом файле. »

Если "избавится от привязки к конкретной папке" - то задача решена - вместо Вашей строки из предыдущего кода (она выделена красным цветом) поставьте другую, как я понимаю, Ваш код обрабатывает все файлы в папке. Никаких изменений при этом в Вашей строке не требуется. Ежели надо обработать конкретный единичный файл (Вы как-то нечётко сформулировали мысль: то ли Вам папка надо, то ли файл)- пишите, буду думать.

A555555 22-09-2020 19:12 2934626

megaloman
когда нужно склеить, то в папке скорее всего одни кандидаты будут и не страшно, что в ней много других фалов, одинаковость имени склеиваемых хорошо отсеивает ненужные.

А вот для случая "порезать" файл под FAT32 флешку нет особенно ограничителей типа одноименности и в итоге например в папке куда я качаю торренты может быть очень много mkv и т.п., но порезать нужно конкретный.
Просто вставив свой код в ваш, работает, но в инете особенно не принято одиночные файлы видео класть в отдельную папку при раздаче. А копировать в стронку крупные файлы или при скачивании городить каждому свою папку грустный вариант.

У меня есть украденный из интернета код под ffdshow, он перекодированием через ярлык в "Отправить" занимается именно указанного файла.
Код:

@ECHO OFF
IF %1.==. (
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [    NO FILE SPECIFIED                                ]
ECHO [------------------------------------------------------]
) ELSE (
"c:\Program Files\K-Lite Codec Pack\Filters\ffmpeg\ffmpeg.exe" -i %1 -c:v libx264 -pix_fmt yuv420p -preset slow -crf 26 -y %1_[COPY].mp4
ECHO [-------------- SendTo FFmpeg converter ---------------]
ECHO [    SERVED                                          ]
ECHO [------------------------------------------------------]
)
:end

конечно же, как человек без знаний по этой теме, я попробовал вставить и сюда, но не прокатило.

A555555 22-09-2020 19:38 2934627

Вложений: 1
Цитата:

Цитата Fors1k
Все, можете пользоваться. »

снова не работает.
При попытке в общей папке указать како-то файл проходится по всем отвечающим нужному расширению с ошибкой для каждого
http://forum.oszone.net/attachment.p...1&d=1600792807

Попробовал и в тепличных условиях, вынеся в отдельную папку одноименные видео и аудио для склейки, тоже не нравится
http://forum.oszone.net/attachment.p...1&d=1600792689

Fors1k 22-09-2020 19:47 2934629

A555555, Выполните в powershell, покажите вывод еще раз.
Код:

cls
reg query HKLM\Software\Classes\*\shell\MKVmerge\command /ve


A555555 22-09-2020 20:07 2934630

Вложений: 1
Fors1k,
уже положил программу по изначально данному вами пути, чтоб хоть этот момент с русскими буквами и пробелами не влезал
http://forum.oszone.net/attachment.p...1&d=1600794368

Fors1k 22-09-2020 21:55 2934638

A555555,
Вывод каких-то команд лучше выкладывайте текстом, а не скриншотом.
У вас MKVmerge.exe в 'C:\soft\mkvmerge.exe' или в 'd:\Temp2\Windows и сеть\Windows установка\Обновления и настройки\MKV\MKVtoolnix\mkvmerge.exe' ?
На всякий случай покажите вывод $host.Version .

A555555 22-09-2020 22:13 2934639

Fors1k,

Цитата:

Цитата Fors1k
На всякий случай покажите вывод $host.Version . »

Цитата:

Major Minor Build Revisi
----- ----- ----- ------
4 0 -1 -1

Цитата:

Цитата Fors1k
У вас MKVmerge.exe в 'C:\soft\mkvmerge.exe' или в 'd:\Temp2\Windows и сеть\Windows установка\Обновления и настройки\MKV\MKVtoolnix\mkvmerge.exe' ? »

На данный момент и там и там, но прописано вашим кодом сюда
'C:\soft\mkvmerge.exe'
чтоб точно не мешались сюда ещё пути.

Fors1k 22-09-2020 23:58 2934641

Цитата:

Цитата A555555
Major Minor Build Revisi
----- ----- ----- ------
4 0 -1 -1 »

Вам нужно установить обновление: https://www.microsoft.com/en-us/down....aspx?id=54616

A555555 23-09-2020 19:15 2934792

Цитата:

Цитата Fors1k
Вам нужно установить обновление: https://www.microsoft.com/en-us/down....aspx?id=54616 »

Fors1k
На этом у меня тупик, служба обновления отключена и ещё много чего отключено давным давно в моей Win 8.1 :(
Повырезано много, думаю и пытаться запустить службу бесполезно.
Попытался, но установка обновления начинается, идет процесс, но неудача в итоге.
Ваш способ и для второго моего случая подошел бы, как раз выбирается файл, но...
Спасибо большое вам за помощь.

megaloman
придумал костыль как выделить из толпы mkv файлов в папке, нужный и его порезать.
Можно сменить у файла расширение например на .mmm и именно такие расширения искать bat файлу задать.
Как аварийный вариант пойдет.
Красиво как сделать, чтоб именно файл указывать можно было, ищу в инете, не могу пока ничего подобного найти :(
Т.е. вот такое извращение, сменил расширение на .mmm и запускаю
Код:

@ECHO OFF
for %%f in ("*.mmm") do mkvmerge.exe --output "%%~nf/%%f" --audio-tracks rus --split size:4095M ( "%%f" )
for /d /r %%f in (.) do ren "%%f\*.mmm" "*.mkv"
:end

Сначала режет складывая в папку с именем файла, затем переименовывает все .mmm в .mkv включая подпапки текущей папки.

A555555 03-10-2020 09:48 2935464

megaloman
Здравствуйте.
Не получится через Bat файл, для конкретного файла выполнять разрезание?

Я уже в принципе и к предыдущему для всей папки варианту приспособился, но не могу не спросить у вас ещё раз.

megaloman 03-10-2020 12:03 2935471

A555555, Нет ничего проще чем через Bat файл для конкретного файла что-то сделать. Сложнее понять, что Вы хотите получить. Я совершенно не знаю утилиту mkvmerge.exe и могу только очень приблизительно догадываться, как корректно нарисовать имя/путь файла в её параметрах. Вот вариант, но делал совершенно тупо и реально на Вашей утилите не проверял.
Код:

@Echo Off
cls

If Not Exist "%~1" (Echo File "%~1" not found &Pause &Exit /B 2)
       
Pushd "%~dp1"
        Echo %CD%  %1
        mkvmerge.exe --output "%~n1/%~nx1" --audio-tracks rus --split size:4095M ( "%~nx1" )
Popd
Pause

Exit /B

Технология та же: затаскиваете конкретный файл мышкой на батник или на значок батника.


Время: 17:39.

Время: 17:39.
© OSzone.net 2001-