Пакетный файл: двойные кавычки внутри двойных кавычек - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть пакетный файл, который вызывает команду, исключающую команду:

forfiles /s /m *.* /c "cmd /c ffmpeg -i C:\dummy.mkv -i @relpath -vcodec copy -acodec copy @relpath.mkv"

Если в качестве параметров @relpath указан пробел, я получаю сообщение об ошибке:

Нет такого файлаили каталог

Я искал в Интернете один час, но не нашел решения.

Я пытался \"@relpath\", ^"@relpath^", ""@relpath"" ...ничего не помогло.

Любая помощь будет принята с благодарностью, так как мне потребовалось около 4 минут, чтобы найти правильный способ рекурсивного преобразования всех моих файлов, а оставшуюся часть времени нет, чтобы найти решение для такого простогопроблема, поскольку "мой путь к файлу содержит пробелы" ...


[Редактировать /] - из комментариев (преобразовано из изображения и на английский язык).

Пожалуйста, посмотрите здесь, исключение FORFILES /S /P . /C "cmd /c echo @RELPATH && dir @RELPATH", которое вы можете увидеть в конце, при выполнении команды dir, The system cannot find the file specified..Если вы вручную наберете dir с именем файла, он будет работать нормально.Это моя проблема;точно.

C:\dum my>FORFILES /S /P . /C "cmd /c echo @RELPATH && dir @RELPATH"

".\dir 2"
 Volume in drive C has no label.
 Volume Serial Number is 0CC7-3CE2

 Directory of C:\Dum my\dir 2

23/12/2018  20:38    <DIR>          .
23/12/2018  20:38    <DIR>          ..
23/12/2018  20:38               438 te st.file
               1 File(s)            438 bytes
               2 Dir(s)  30,868,815,872 bytes free
".\dir1"
 Volume in drive C has no label.
 Volume Serial Number is 0CC7-3CE2

 Directory of C:\Dum my\dir1

23/12/2018  20:38    <DIR>          .
23/12/2018  20:38    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  30,868,815,872 bytes free
".\my file"
 Volume in drive C has no label.
 Volume Serial Number is 0CC7-3CE2

 Directory of C:\Dum my

23/12/2018  20:22               352 my file
               1 File(s)            352 bytes
               0 Dir(s)  30,868,815,872 bytes free
".\dir 2\te st.file"
The system cannot find the file specified.

C:\Dum my>

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Несмотря на то, что OP решил проблему с использованием @PATH вместо @RELPATH, почему @RELPATH не удается?

Как указано в Compo и видно из выходных данных команды, кавычки не являются проблемой.

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

forfiles /S /P . /C "cmd /v /c echo @RELPATH & echo !cd! & dir @RELPATH"

, чтобы получить этот вывод (извините, версия для испанского windows)

W:\dum my>tree /f
Listado de rutas de carpetas para el volumen Nuevo vol
El número de serie del volumen es 0000-0000
W:.
├───dir 1
└───dir 2
        te st.file


W:\dum my>forfiles /S /P . /C "cmd /v /c echo @RELPATH & echo !cd! & dir @RELPATH"

".\dir 1"
W:\dum my
 El volumen de la unidad W es Nuevo vol
 El número de serie del volumen es: 0000-0000

 Directorio de W:\dum my\dir 1

24/12/2018  11:00    <DIR>          .
24/12/2018  11:00    <DIR>          ..
               0 archivos              0 bytes
               2 dirs  47.507.652.608 bytes libres
".\dir 2"
W:\dum my
 El volumen de la unidad W es Nuevo vol
 El número de serie del volumen es: 0000-0000

 Directorio de W:\dum my\dir 2

24/12/2018  11:00    <DIR>          .
24/12/2018  11:00    <DIR>          ..
24/12/2018  11:00                 0 te st.file
               1 archivos              0 bytes
               2 dirs  47.507.652.608 bytes libres
".\dir 2\te st.file"
W:\dum my\dir 2
El sistema no puede encontrar el archivo especificado.

W:\dum my>

Когда forfiles достигает te st.file, текущий активный каталогизменилось с W:\dum my на W:\dum my\dir 2.

Это означает, что, хотя вывод @RELPATH является правильным с точки зрения forfiles, у нас неверный путь для команды dir, которая выполняется из другого каталога.

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

0 голосов
/ 23 декабря 2018

Исходя из моего первоначального комментария и информации в последующих комментариях , я бы предложил заменить @RelPath на @Path

ForFiles /S /M *.* /C "ffmpeg -i C:\dummy.mkv -i @Path -vcodec copy -acodec copy @Path.mkv"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...