Пользовательский протокол (через реестр Windows) для открытия файла в локальной папке и с программным обеспечением по умолчанию - PullRequest
0 голосов
/ 03 февраля 2020

Пожалуйста, прочитайте мой ответ ниже

Я хотел бы открыть локальные файлы в их программном обеспечении по умолчанию при нажатии на ссылку HTML (в chrome), указав пользовательскую схему URI, определенную в Windows Реестр. Я пробовал много разных синтаксисов для определения правила реестра и для ссылки, которую я использую. Мой файл .reg по умолчанию выглядит следующим образом:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\test]
"URL Protocol"=""
@="URL:test Protocol"
"DefaultIcon"="\"C:\\Windows\\system32\\notepad.exe\",1"

[HKEY_CLASSES_ROOT\test\shell]

[HKEY_CLASSES_ROOT\test\shell\open]

[HKEY_CLASSES_ROOT\test\shell\open\command]
@="\"C:\\Windows\\system32\\notepad.exe\" \"%1\""

Я пробовал с каждым примером, который я мог найти для% 1,% *, "% 1" "% 2" ... Сейчас я я просто пытаюсь с помощью блокнота, хотя в конечном итоге я хотел бы использовать для него файл explorer.exe, чтобы открыть программное обеспечение по умолчанию для файла указанного типа.

Мой HTML файл:

<a href="test:C:test.txt">Open</a>

Я пробовал test: // C: [...], test: /// C: [...] и с косой чертой и обратной косой чертой в пути к файлу.

В приведенных выше 2 версиях открывается блокнот, но я получаю сообщение «Неверный синтаксис имени файла, имени каталога или метки тома». (Я помещаю свой файл в C диск root, чтобы избежать любых специальных символов)

Кроме того, если я определяю прямой путь к файлу вместо строки параметра: @ = "\ "C: \ Windows \ explorer.exe \" \ "C: \ test.txt \" ", файл открывается без проблем.

Что я делаю не так? Есть ли способ увидеть строку, полученную в качестве параметра?

ОБНОВЛЕНИЕ Я изменил раздел реестра, чтобы вызвать простой пакетный файл ("C: \ test.bat"% 1) с командой echo, чтобы увидеть полученный параметр (echo % 1 пауза). По умолчанию передается весь URI (например, «test: C: \ test.txt»). Я обнаружил, что если после схемы поставить запятую, пакетный файл получит 2 параметра:% 1 = "test:" &% 2 = "C: \ test.txt". Но значение ключа реестра по-прежнему должно иметь "% 1" ...

"% 2" не содержит ничего, прежде чем он попадет в командный файл. К сожалению, я не могу напрямую вызвать "app.exe"% 2 "и должен вызывать его из .bat, я обновлю, если найду решение.

1 Ответ

0 голосов
/ 12 марта 2020

Решение:

Вы можете определить раздел реестра для вызова сценария с использованием ссылки href в качестве аргумента:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\test]
"URL Protocol"=""
@="URL:test Protocol"

[HKEY_CLASSES_ROOT\test\shell]

[HKEY_CLASSES_ROOT\test\shell\open]

[HKEY_CLASSES_ROOT\test\shell\open\command]
@="\"C:\\Windows\\Your-Script.bat\" %1"

И затем использовать JScript в вашем Script.bat для разделения и декодирования URI:

@if (@This==@IsBatch) @then
wscript //E:JScript "%~dpnx0" %1
exit /b
@end
WScript.CreateObject("WScript.Shell").Run("explorer.exe " + decodeURIComponent(WScript.arguments(0).split("test:")[1]));
WScript.Quit(0);

Это запустит приложение по умолчанию и откроет ваш файл.

===================== ================================================== ======

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

строка файла reg:

@="\"C:\\Windows\\Your-Script.bat\" %test:% %1"

script:

@if (@This==@IsBatch) @then
wscript //E:JScript "%~dpnx0" %*
exit /b
@end
WScript.CreateObject("WScript.Shell").Run("explorer.exe " + decodeURIComponent(WScript.arguments(1).split(WScript.arguments(0))[1]));
WScript.Quit(0);

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

<a href="test:,C:test.txt,">Open</a>

с:

@="\"C:\\Windows\\Your-Script.bat\" %2"

и в Ваш скрипт:

wscript //E:JScript "%~dpnx0" %2

===================================== ================================

Ваш файл должен открываться в программном обеспечении по умолчанию в любом веб-браузере Вы можете использовать sh.

Если вы хотите, чтобы ваш браузер перестал запрашивать разрешение на выполнение скрипта каждый раз (Chrome / Edge), вы можете запустить этот reg-файл:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Chromium]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001

Будет отображаться флажок «запомнить».

...