Как напечатать несколько путей к файлам в файл без оборачивания в двойные кавычки?

Вопрос или проблема

Я пытаюсь использовать ffmpeg для конкатенации нескольких video файлов, используя пример сохранения всех файлов, предоставленных в файл с здесь (под Автоматическая генерация входного файла), с помощью цикла for. Файл успешно создан в том месте, где я хотел, но при выполнении команды вывод сообщает: Небезопасное имя файла '"C:\Users\Mr. Mendelli\Desktop\Track 1.mp4"'. Содержимое моего индексного файла выглядит следующим образом:

file '"C:\Users\Mr. Mendelli\Desktop\Track 1.mp4"'
file '"C:\Users\Mr. Mendelli\Desktop\Track 2.mp4"'

Я полагаю, что проблема в том, что пути к файлам обрамлены двойными кавычками, но я не могу понять, как избавиться от них в примере использования цикла for. Я пробовал их пример с обрамлением одинарными кавычками %%i и без него, но безрезультатно:

...
(
    for %%i in (
    %*
) do @echo file '%%i') > "%temp%\FileIndex"
...

В дополнение, если только не существует альтернативного подстановочного знака, я использую %*, так как использование этого скрипта может потребовать два или более файлов, не гарантируя, что я всегда буду объединять только два.

Обновление:
Я выяснил проблему, хотя все еще не могу решить ее в своем коде:

  1. Пути к файлам должны быть обрамлены только одинарными кавычками.
  2. Разделители путей должны быть прямыми слешами, а не обратными, даже на Windows.

Как мне гарантировать, что одинарные кавычки и прямые слеши будут напечатаны в FileIndex в моем пакетном скрипте?

Я не думаю, что это связано с двойными кавычками, это связано с полными путями к файлам (а не относительными именами файлов).

Смотрите https://www.ffmpeg.org/ffmpeg-formats.html#Options:

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

Вы можете просто игнорировать “Проверку безопасности” FFmpeg, добавив -safe 0 к команде FFmpeg. Это широко используется и в целом не должно вызывать никаких проблем.

Я случайно ответил на свой собственный вопрос ранее в моем коде, который я упустил с циклом for, который перечисляет все файлы, предоставленные скрипту, и это так же просто, как добавить один символ в существующую переменную. Использование %%~i стало ключом, так как оно не включает двойные кавычки в пути к файлам, обрабатываемым в цикле.

...
(
    for %%i in (
    %*
) do @echo file '%%~i') > "%temp%\FileIndex"
...

Ответ или решение

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

Шаги по созданию файла-индекса без обрамления кавычками

  1. Использование переменной %%~i: Как вы уже заметили, использование конструкции %%~i в цикле for позволяет использовать путь к файлу без обрамляющих кавычек. Это означает, что вам не нужно дополнительно заботиться о кавычках, которые могут быть не нужны в вашем случае.

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

Пример кода

Вот пример полного кода в рамках пакетного файла, который создает файл-индекс с правильным форматированием:

@echo off
setlocal enabledelayedexpansion

(
    for %%i in (%*) do (
        set "filepath=%%~i"
        rem Замена обратных слэшей на прямые
        set "filepath=!filepath:\=/!"
        echo file '!filepath!'
    )
) > "%temp%\FileIndex.txt"

echo Файл-индекс успешно создан: %temp%\FileIndex.txt

Объяснение кода

  • setlocal enabledelayedexpansion: Эта команда позволяет использовать !var! для доступа к переменным внутри блока for, что критично для изменения значений переменных в пределах цикла.

  • set "filepath=%%~i": Сохраняет путь к файлу без обрамляющих кавычек в переменной filepath.

  • set "filepath=!filepath:\=/!": Заменяет все обратные слэши на прямые, что делает путь совместимым с требованиями FFmpeg.

  • echo file '!filepath!': Печатает строку формата file '...' в файл-индекс, используя одинарные кавычки.

Общие рекомендации

  • Проверка на безопасность: Хотя вы можете использовать параметр -safe 0 в команде FFmpeg, чтобы игнорировать проблемы с безопасностью путей, удобнее и надежнее предварительно отформатировать пути в вашей программе.

  • Обращение к документации: Всегда стоит обращаться к официальной документации FFmpeg для получения наиболее актуальных требований и рекомендаций.

Теперь вы сможете с легкостью генерировать список файлов для объединения с FFmpeg, избегая проблем с кавычками и форматом путей.

Оцените материал
Добавить комментарий

Капча загружается...