Как избежать & амперсанд в обработчике пользовательских протоколов в Windows - PullRequest
4 голосов
/ 01 октября 2019

Я создал собственный обработчик протокола по этой ссылке . Дело в том, что мне нужно открыть ссылку, которая может быть открыта только в IE и может содержать несколько параметров запроса и должна быть открыта в IE из нашего веб-приложения, работающего на Chrome (это действительно раздражает). После многих попыток и неудач мне удалось найти фрагмент , чтобы добавить запись в куст реестра Windows, и сделать файл .reg и запустить:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\ie]
"URL Protocol"="\"\""
@="\"URL:IE Protocol\""
[HKEY_CURRENT_USER\Software\Classes\ie\DefaultIcon]
@="\"explorer.exe,1\""
[HKEY_CURRENT_USER\Software\Classes\ie\shell]
[HKEY_CURRENT_USER\Software\Classes\ie\shell\open]
[HKEY_CURRENT_USER\Software\Classes\ie\shell\open\command]
@="cmd /k set myvar=%1 & call set myvar=%%myvar:ie:=%% & call \"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe\" %%myvar%% & exit /B"

Это сработало, но проблема в том,Если ссылка содержит более 1 параметра запроса, все, кроме первого, опущены, я уверен, что это из-за кодировки символов в командной строке Windows:

e.g. some_example_url?query1=value1&query2=value2&query3=value3 is becoming some_example_url?query1=value1

Я нахожу это решение , ноэто тоже не сработало. Как правильно экранировать символ &, чтобы его можно было открыть в IE со всеми параметрами запроса. (как упомянуто выше, ссылка запускается веб-приложением, работающим в Chrome)

EDIT : код, который запускает:

fileClicked(url) {
  // url should be escaped with ^
  const escapedUrl = url.replace(/&/gi, '^&');
  const ie = document.createElement('a');
  // ie: scheme => custom protocol handler
  // host computer (windows) should add custom protocol to windows registry
  ie.href = `ie:${escapedUrl}`;
  ie.click();
}

EDIT 2 @muzafako исправил скрипт, нужно заменить только последнюю строку, как показано ниже:

@="cmd /c set url=\"%1\" & call set url=%%url:ie:=%% & call start iexplore -nosessionmerging -noframemerging %%url%%"

1 Ответ

4 голосов
/ 02 октября 2019

Вам не нужно декодировать параметры запроса вообще. Я пытался найти решение этой проблемы и увидел этот ответ . Это работает для меня. просто измените командную строку на:

@="cmd /c set url=\"%1\" & call set url=%%url:ie:=%% & call start iexplore -nosessionmerging -noframemerging %%url%%"
...