Передача нескольких аргументов в пакетном цикле FOR с использованием двойных кавычек?

Я использую интерфейс командной строки MediaInfo в пакетном сценарии и не знаю, в чем проблема, но я не могу заставить эту команду работать, если я использую путь к папке, в котором есть пробелы. Я не новичок в пакетных сценариях и за эти годы создал сотни таких скриптов. Обычно я думаю, что использование двойных кавычек решит проблему, но я знаю, что это что-то еще, связанное с использованием команды «for/f» и передачей нескольких аргументов с двойными кавычками. Я пробовал все, что мог придумать, но все еще не могу заставить его работать, если я использую путь с пробелами. Без пробелов работает нормально, только не с пробелами.

Обратите внимание, что это не полный пакетный скрипт, а лишь фрагмент кода, вызывающего нарушение. Я также изменил двойные переменные «%%» на одинарные «%», чтобы упростить тестирование в командной строке.

Кроме того, в моем пакетном сценарии вместо использования «эхо» я вывожу в переменную, поэтому я должен использовать команду «для». Все это не имеет отношения к данному конкретному вопросу.

РАБОЧИЕ ПРИМЕРЫ

for /f %g in ('C:\MediaInfo.exe "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g

.

for /f "usebackq delims=" %g in (`C:\MediaInfo.exe "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"`) do echo %g

.

НЕ РАБОТАЮЩИЕ ПРИМЕРЫ

for /f %g in ('"C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g

.

for /f "usebackq delims=" %g in (`C:\folder with spaces\MediaInfo.exe "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"`) do echo %g

Обе команды "НЕ РАБОТАЮТ" приводят к одной и той же ошибке...

«C:\folder» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.


person AppetiteForDestruction    schedule 19.05.2020    source источник
comment
обратите внимание на использование ' вместо `, которое в данном контексте используется для наборов, содержащих команды.   -  person T3RR0R    schedule 19.05.2020
comment
@ T3RR0R, использование usebackq вместе с ' позволяет интерпретировать часть после in как буквальную строку, но не как команду для выполнения; вам понадобится `вместо этого. В любом случае, это не поможет в данной ситуации...   -  person aschipfl    schedule 19.05.2020
comment
Возможно, вы неправильно поняли, я имел в виду «включение команд».   -  person T3RR0R    schedule 19.05.2020


Ответы (1)


Команда в наборе (это часть в скобках перед do) for /F цикл фактически выполняется с помощью cmd /C, что может котировки в зависимости от их позиций. Например, в командной строке:

for /f "delims=" %g in ('"C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"') do echo %g

внешняя пара кавычек удаляется, оставляя после себя недопустимую командную строку:

C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv

Если вы сейчас добавите дополнительную пару кавычек, это сработает. Вы даже можете экранировать эти кавычки, чтобы не менять другие экранирующие кавычки в случае:

for /f "delims=" %g in ('^""C:\folder with spaces\MediaInfo.exe" "--Inform=General;%MenuCount%" "D:\Some Folder\filename.mkv"^"') do echo %g
person aschipfl    schedule 19.05.2020
comment
Что ж, это должно работать, хотя я не знаю, что такое MediaInfo.exe, поэтому не могу сказать, неверна ли его командная строка. Для меня цитируемая часть "--Inform=General;%MenuCount%" выглядит немного странно - возможно, она должна читаться как --Inform^=General^;%MenuCount% (экранирование ^ необходимо только внутри цикла for /F!). Что содержит переменная %MenuCount%? В любом случае, сначала вы должны попробовать командную строку вне for /F... - person aschipfl; 20.05.2020
comment
Извините, я разместил свой комментарий, а затем удалил его, потому что понял, что допустил ошибку. Но да, ваше решение работает отлично! Я потратил часы на это вчера и не мог понять это. Все годы я использую пакетные скрипты, и это первый раз, когда я столкнулся с этой проблемой. Обязательно добавлю в свой арсенал. знак равно - person AppetiteForDestruction; 20.05.2020