Процент экранирования ImageMagick командной строки Windows

Я пытаюсь использовать ImageMagick из командной строки в Windows 7 для преобразования нескольких изображений одновременно. Я хотел бы использовать интерфейс опции-set, но я получаю неожиданные результаты. Короткий пример некоторых странностей, которые я вижу:

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world "%[filename:foo]_%[filename:bar].png"
example.jpg=>helloworld.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.125u 0:00.135

обратите внимание, что символ подчеркивания таинственным образом удаляется из выходного файла. Я могу использовать знак вставки ( ^ ), чтобы избежать второго знака процента, чтобы сохранить подчеркивание:

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world "%[filename:foo]_^%[filename:bar].png"
example.jpg=>hello_world.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.125u 0:00.126

что случилось здесь? Почему вставка каретки приводит к сохранению подчеркивания? Каретка ( ^ ) даже правильный эскейпер, чтобы пытаться? Является ли это поведение из-за расширения переменной среды командной оболочки или странность является результатом того, как ImageMagick обрабатывает процентные экранирования? В любом случае, существуют ли общие принципы использования символов процентов в аргументах командной строки, которым можно следовать, чтобы вызвать предсказуемое поведение?

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

Я посмотрел наhttp://www.robvanderwoude.com/escapechars.php и экранирование %в именах файлов / папок в командной строке но не смог понять, как применить совет к моей проблеме.

обновление

добавление еще несколько примеров, чтобы ответить на вопросы в комментариях от @dbenham и @Synetech.

перемещение символа подчеркивания перед вторым символом процента, как в последнем примере выше, перед символом подчеркивания, создает файл с именем hello^world.png:

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world "%[filename:foo]^_%[filename:bar].png"
example.jpg=>hello^world.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.141u 0:00.132

каретка-экранирование окружающих кавычек всегда приводит к helloworld.png, независимо от того, где каре помещаются внутри:

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world ^"^%[filename:foo]_^%[filename:bar].png^"
example.jpg=>helloworld.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.109u 0:00.115

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world ^"%[filename:foo]_^%[filename:bar].png^"
example.jpg=>helloworld.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.141u 0:00.143

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world ^"^%[filename:foo]_%[filename:bar].png^"
example.jpg=>helloworld.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.125u 0:00.126

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world ^"%[filename:foo]_%[filename:bar].png^"
example.jpg=>helloworld.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.125u 0:00.131

C:>convert example.jpg -verbose -set filename:foo hello -set filename:bar world ^"%[filename:foo]^_%[filename:bar].png^"
example.jpg=>helloworld.png JPEG 352x264 352x264+0+0 8-bit DirectClass 131KB 0.125u 0:00.111
10
задан Community
14.11.2022 6:52 Количество просмотров материала 3670
Распечатать страницу

1 ответ

я не могу объяснить странное поведение вы видите. Это почти похоже на результат cmd.exe процентов обработки, но это не совсем соответствует cmd.exe поведение, как я понимаю.

экранирование процентов в пакетном файле легко-просто удвоить их. Но это не работает из командной строки. Технически, нет никакого способа избежать процента на Windows cmd.командной строки exe-файла.

командная строка может расширять проценты в одном из двух способы:

1) разверните переменные среды.

если текст между двумя процентами совпадает с именем переменной среды, то конструкция percent заменяется значением.

C:\test>set test=hello

C:\test>echo %test%
hello

если текст между процентами не соответствует имени переменной среды, то сохраняется полный исходный текст.

C:\test>echo %notDefined%
%notDefined%

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

C:\test>echo ^%test^%
%test%

но это не совсем избежать процентов. Вместо этого он ищет переменную с именем test^, и не найдя его. Таким образом, исходный текст не нарушается. После этого каретки извлекутся во время нормальной обработки избежания. Это можно доказать, определив переменную с символом вставки в имени.

C:\test>set "test^=goodbye"

C:\test>echo ^%test^%
goodbye

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

C:\test>echo %te^st%
%test%

если текст цитируется, то каре будет не только за цитаты тоже сбежал.

C:\test>echo "%te^st%"
"%te^st%"

C:\test>echo ^"te^st%^"
"%test%"

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

C:\test>echo %test:el=a%
halo

C:\test>echo %test:~1,2%
el

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

C:\test>echo %test:1,2%
%test:1,2%

этот последний пример больше всего напоминает вашу ситуацию. Текст между первым процентом и двоеточием не соответствует переменной, а текст между двоеточием и последним процентом не является конструкцией подстановки или подстроки,так всю конструкция должна быть сохранена, включая символ подчеркивания. По этой причине, я не вижу, как УМК.exe может снять с тебя нижнее подчеркивание. но тот факт, что добавление курсора перед вторым процентом сохраняет подчеркивание, вызывает у меня подозрения. Я действительно хотел бы знать,что произойдет, если вы переместите курсор перед подчеркиванием.



2) развернуть для переменных

не проблема в вашем случае, но процентов может также вызывают проблемы, если цикл FOR действует. В этом случае невозможно защитить процент с помощью каретки, поскольку каретка удаляется до расширения переменной FOR. В этом примере я хочу, чтобы выходные данные читались %A=1, но это не работает.

C:\test>for %A in (1 2) do @echo ^%^A=%A
1=1
2=2

самый удобный способ защитить процент-ввести другой для переменной

C:\test>for %C in (%) do @for %A in (1 2) do @echo %CA=%A
%A=1
%A=2

это работает так же хорошо, чтобы положить A в другом переменная

C:\test>for %C in (A) do @for %A in (1 2) do @echo %%C=%A
%A=1
%A=2

обновление

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

C:\>echo convert example.jpg -verbose -set filename:foo hello -set filename:bar world "%[filename:foo]_%[filename:bar].png"

символ подчеркивания сохраняется на моей машине: -)


если вас интересует, как работает парсер команд, то см.https://stackoverflow.com/a/4095133/1012053. Этот ответ в основном касается пакетного разбора, но правила очень похожи, и в конце раздела кратко описываются основные различия.

3
отвечен dbenham 2022-11-15 14:40

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх