Войти

Показать полную графическую версию : Декодировать URL кириллицу в Bat файле.


artemleb
16-11-2019, 20:06
Добрый вечер!
Занимаюсь разработкой БД для использования в нашей организации. Суть базы данных такая, что с браузера должен работать переход на локальную папку пользователя. Но к сожалению браузеры из за политики безопасности эту функцию закрыли на прочь. Я нашел в интернете альтернативный вариант, как этот запрет обойти:

Переход по ссылке с сайта:

<a href="myproto://C:/My Folder/123">открыть папку</a>


Одноразовый запуск рег файла на компьютера пользователя:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\myproto]
"URL Protocol"=""
@="URL:Myproto Protocol"

[HKEY_CLASSES_ROOT\myproto\shell]

[HKEY_CLASSES_ROOT\myproto\shell\open]

[HKEY_CLASSES_ROOT\myproto\shell\open\command]
@="\"C:\\myproto.bat\" \"%1\""



Выполняемый bat файл на компьютере пользователя, который должен открывать папку в ссылке:

@echo off
set "path=%~1"
setlocal enabledelayedexpansion
set path=%path:myproto://=%
set path=%path:"=%
set path=%path:/=\%
set path=!path:%%20= !
set path=!path:%%5C=\!
C:\Windows\explorer.exe "%path%"


Меня такой формат открытия вполне устраивает. Есть одно НО, этот способ не работает если папка названа русским языком. Посоветуйте, как можно решить эту проблему! Сразу скажу что далек от темы с батниками.

DJ Mogarych
16-11-2019, 23:20
БД в организации, зависящая от огромного размера дыры в безопасности, когда браузер может открывать локальные каталоги, и от батников - это сильно.
А потом говорят - переходите на отечественное ПО. А оно всё сплошь вот такое - из костылей и пластилина.

artemleb
17-11-2019, 11:18
БД в организации, зависящая от огромного размера дыры в безопасности, когда браузер может открывать локальные каталоги, и от батников - это сильно.
А потом говорят - переходите на отечественное ПО. А оно всё сплошь вот такое - из костылей и пластилина.

Поучения это конечно хорошо, но первое я не в кои море не претендую на создание ПО для общего распространения, моя задача просто сделать более удобным фильтрацию и сортировку большой файловой системы, которая накопилась за много лет на сетевом диске компании. Второе данной системой будет пользоваться 5-10 человек одной организации. Поэтому о какой безопасности мы говорим в компании, у которой даже нету финансовых средств на нормальное ПО? Лучше подскажите как можно решить данную проблему и этим вы поможете одной маленькой и не богатой организации и заработаете +10 к своей карме))

iglezz
17-11-2019, 11:58
artemleb, Через echo надо смотреть что там на вход батнику подаётся.

artemleb
17-11-2019, 12:24
artemleb, Через echo надо смотреть что там на вход батнику подаётся.
Я посмотрел туда приходит не декодированный url в таком виде: C:\%D0%BF%D0%B0%D0%BF%D0%BA%D0%B0

Iska
17-11-2019, 12:48
artemleb, вот потому-то пакетным файлам там не место.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\myproto]
"URL Protocol"=""
@="URL:Myproto Protocol"

[HKEY_CLASSES_ROOT\myproto\shell]

[HKEY_CLASSES_ROOT\myproto\shell\open]

[HKEY_CLASSES_ROOT\myproto\shell\open\command]
@="wscript.exe \"C:\\Мои проекты\\0284\\0001.js\" \"%1\""
sFolder = decodeURI(WScript.Arguments.Item(0)).replace('myproto:\/\/', '').replace('\/', '');

if(WScript.CreateObject('Scripting.FileSystemObject').FolderExists(sFolder)) {
WScript.CreateObject('Shell.Application').Open(sFolder);
} else {
WScript.Echo('Can\'t find folder [' + sFolder + ']');
}
<html>
<body>
<a href="myproto://C:\Мои проекты\0135">открыть папку 0135</a><br />
<a href="myproto://C:\Мои проекты\bla-bla-bla">открыть папку bla-bla-bla</a>
</body>
</html>
P.S. И в целом коллега DJ Mogarych абсолютно прав.

iglezz
17-11-2019, 13:10
artemleb, Фраза "Занимаюсь разработкой БД для использования в нашей организации." наводит на мысли, что вам доступны более адекватные способы решения этой задачи, чем использование батников.

Программа минимум в рамках имеющегося батника -- использовать утилиту-перекодировщик для строки с url (таких не знаю, но они наверняка существуют)

Но лучше или нормальное windows-приложение или скрипт на локальном вебсервере.

artemleb
17-11-2019, 16:28
P.S. И в целом коллега DJ Mogarych абсолютно прав. »

Я согласен, что данный способ является костылем, который еще и не безопасный. Но я интересовался этой темой в просторах интернет и пробовал много различных вариантов и не один не работал. Пришлось брать вышеуказанный способ, жертвуя безопасностью. Если предложите правильный способ буду премного благодарен, готов даже отблагодарить, отправить 500 руб. на мороженое)

P.S. Ваш способ работает, благодарю за помощь!!!

greg zakharov
17-11-2019, 21:13
artemleb, за использование myproto следовало бы настучать по рукам (правила форума запрещают эксплойты и иже с ними, так что довольствуйтесь лишь сухой констатацией факта небезопасности использования сего). Во-вторых, что Apache, что nginx вполне дружат с кириллицей (правильно ли ли вас понимаю, у вас сервачок?), - прописывается все в конфигах. В-третьих, командный язык никогда не предназначался для решения сложных задач, для этого уже более десятка лет существует PowerShell (и прочие интерпретируемые языки вроде Perl или Python - и вовсе динозавры, к слову), а с учетом, что для PowerShell есть bindings различных СУБД, то проблема озвученная здесь проблемой-то не является. Но раз уж вы любитель плети и латекса острых ощущений, то декодировать строку вроде C:\%D0%BF%D0%B0%D0%BF%D0%BA%D0%B0 c помощью PowerShell можно так:
pwsh -nop -c [Uri]::UnescapeDataString('C:\%D0%BF%D0%B0%D0%BF%D0%BA%D0%B0')
Вернет:
C:\папка




© OSzone.net 2001-2012