Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Декодировать URL кириллицу в Bat файле. (http://forum.oszone.net/showthread.php?t=342968)

artemleb 16-11-2019 20:06 2896672

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

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

<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 2896702

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

artemleb 17-11-2019 11:18 2896732

Цитата:

Цитата DJ Mogarych (Сообщение 2896702)
БД в организации, зависящая от огромного размера дыры в безопасности, когда браузер может открывать локальные каталоги, и от батников - это сильно.
А потом говорят - переходите на отечественное ПО. А оно всё сплошь вот такое - из костылей и пластилина.

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

iglezz 17-11-2019 11:58 2896737

artemleb, Через echo надо смотреть что там на вход батнику подаётся.

artemleb 17-11-2019 12:24 2896742

Цитата:

Цитата iglezz (Сообщение 2896737)
artemleb, Через echo надо смотреть что там на вход батнику подаётся.

Я посмотрел туда приходит не декодированный url в таком виде: C:\%D0%BF%D0%B0%D0%BF%D0%BA%D0%B0

Iska 17-11-2019 12:48 2896749

artemleb, вот потому-то пакетным файлам там не место.

Скрытый текст
*.reg
Код:

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\""

0001.js
Код:

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 + ']');
}

0001.html
Код:

<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 2896757

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

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

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

artemleb 17-11-2019 16:28 2896806

Цитата:

Цитата Iska
P.S. И в целом коллега DJ Mogarych абсолютно прав. »

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

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

greg zakharov 17-11-2019 21:13 2896893

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:\папка


Время: 23:27.

Время: 23:27.
© OSzone.net 2001-