Как передать имя файла Unicode в команде реестра (cygwin bash)? - PullRequest
0 голосов
/ 28 апреля 2020

выделил жирным шрифтом мой вопрос ниже, если вы хотите просмотреть)

В моем реестре под ключом

\HKEY_CLASSES_ROOT\SystemFileAssociations\.file_extension\shell\Context menu text\command

я добавил следующую команду:

"C\cygwin64\bin\bash.exe" -l "some_script.sh" "%1"

%1 - имя файла, из которого происходит контекстное меню (щелчок правой кнопкой мыши). Насколько я понимаю, неважно, что вызываемая программа называется cygwin bash, поскольку следующая проблема возникает из-за того, как передается "%1", но я использую ее для проверки содержимого.

Эта команда работает нормально, если в абсолютном пути к файлу нет символов Юникод. Проверка содержимого переменной с помощью bash, как

echo "$1"

, происходит следующее:


Вопрос

  • , если нет символов Unicode, он печатает, например, C:\path\possibly with spaces\to some\file.file_extension
  • , если есть символы Unicode, он печатает "C:\path\possibly with スペース\to some\file.file_extension" вместо

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


Это мешает мне использовать аргумент в bash достаточно равномерно ... Мой текущий обходной путь в сценарии bash -

possible_unicode_arg="$(echo "$1" | sed -r 's/^"(.+)"$/\1/')"

который работает, но я бы предпочел не объявление Сделайте это для каждого сценария, который я когда-либо напишу, просто потому, что я могу добавить запись для него в реестре ... Однажды у меня была похожая проблема с windows добавлением случайных кавычек вокруг имен файлов с пробелами, для которых я обнаружил, что решение использует %~1 вместо %1. Однако, если я добавлю это в команду реестра, аргумент просто передается как литерал %~1, так что это не работает. Я не знаю, какая оболочка выполняет команды в реестре, так что, может быть, это тоже будет полезно ... и где я могу найти синтаксис этой оболочки?

Редактировать

Я теперь изменил свой Обходной путь для установки

"C\cygwin64\bin\bash.exe" -lc "path=""$@""; some_script.sh ""$path""" dummyscriptname %1

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

"C:\cygwin64\bin\bash.exe" -lc "cd ""$(dirname ""%1"")""; ""$(cygpath ""%1"")"""

Это также не работает, если в имени файла указан Юникод, но, по-видимому, по другой причине: заключив %1 в двойные кавычки, кажется, что cmd каким-то образом преобразует содержащийся Unicode в escape-последовательности, содержащие одинарные кавычки ', которые при использовании внутри команды bash интерпретируются, что приводит к ошибкам команда. Когда я не заключаю %1 в двойные кавычки, то, похоже, этого не происходит, и Unicode каким-то образом передается как необработанный символ и может быть непосредственно прочитан как есть с помощью bash. Итак, единственное, что я нашел, это работает:

"C:\cygwin64\bin\bash.exe" -lc "path=""$@""; cd ""$(dirname ""$path"")""; ""$(cygpath ""$path"")""" dummyscriptname %1

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

...