Запускатель и PATHEXT

Хотите говорить о Far и не знаете, куда обратиться?
User avatar
Smitis
Posts: 1654
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 times

Запускатель и PATHEXT

Post by Smitis »

Latest post of the previous page:

DrKnS wrote: Wed 11 Nov, 2020 11:12 С такими репортами мы далеко не уедем.
Но это ещё не багрепорт. Хотя, в моём вопросе почти всё верно. Подробнее:
Допустим, есть testvbs.vbs с единственной строчкой WScript.Echo "ZXCVBNM"
Ассоциации системы настроены на выполнение WSH через гуевый сервер сценариев wscript (включаем так cscript //h:wscript)
В ФАРе задана ассоциация на выполнение сценариев *.vbs cscript.exe "!\!.!"
"Use Windows registered types" выключено.
Помещаем скрипт куда-нибудь в %PATH% (я кладу в %WINDIR%) и выходим ФАРом из этой папки, например, в корень C:\.
Выполняем в командной строке testvbs
Предыдущее поведение: выводится сообщение в консоль (выполнилось через cscript).
Новое поведение: выводиться гуевое окно с сообщением (выполнилось через wscript).
Выполняем в командной строке: testvbs.vbs
Предыдущее поведение: выводится сообщение в консоль.
Новое поведение: сообщение об ошибке Ошибка ввода: Не удается найти файл сценария "C:\testvbs.vbs" (подставился текущий путь, из папки со скриптом выполнится как задумывалось - выведется сообщение в консоль)
Last edited by Smitis on Wed 11 Nov, 2020 13:59, edited 1 time in total.
Разум когда-нибудь победит.
User avatar
DrKnS
Posts: 5903
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 11 times
Been thanked: 364 times

Запускатель и PATHEXT

Post by DrKnS »

Ага, я вас понял.
Smitis wrote: Wed 11 Nov, 2020 12:15 Выполняем в командной строке testvbs
Предыдущее поведение: выводится сообщение в консоль.
Новое поведение: выводиться гуевое окно с сообщением.
Раньше это работало, потому что фар перебирал все в %path% и все в %pathext% и в конце концов находил c:\windows\testvbs.vbs.
Дальше обрабатывались ассоциации и в ОС уходила команда cscript.exe "c:\windows\testvbs.vbs".
Теперь же фар ничего не ищет и поэтому не может знать, что testvbs - это *.vbs, поэтому ассоциация не применяется.
Выполняем в командной строке: testvbs.vbs
Предыдущее поведение: выводится сообщение в консоль.
Новое поведение: сообщение об ошибке Ошибка ввода: Не удается найти файл сценария "C:\testvbs.vbs" (подставился текущий путь, из папки со скриптом выполнится как задумывалось - выведется сообщение в консоль)
В этом случае фар видит, что это *.vbs и ассоциация применяется. Однако, фар не ищет и не знает, в какой папке testvbs.vbs, поэтому подставляется текущий путь.

Действительно, с новым подходом этот сценарий неработоспособен - ассоциации в комстроке будут работать адекватно только при указании расширения (и пути, если файл не в текущей папке). Печально, но вполне логично.
User avatar
HaRT
Moderator
Posts: 9774
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 128 times
Been thanked: 267 times

Запускатель и PATHEXT

Post by HaRT »

DrKnS wrote: Wed 11 Nov, 2020 13:58 Однако, фар не ищет и не знает, в какой папке testvbs.vbs, поэтому подставляется текущий путь.
[…] Печально, но вполне логично.
Не вполне логично. Раз Фар не понял, о каком конкретно файле идёт речь, то какой смысл подставлять в качестве !\ путь активной панели? Для решения пользовательской задачи логичнее было бы, чтобы в таком случае (при запуске ассоциации из комстроки) подставлялся пустой путь. Некоторые скриптовые движки поддерживают собственные пути поиска файлов (например, AWKPATH), и в нынешней реализации они не сработают, а с предлагаемой логикой — сработают успешно.
Last edited by HaRT on Wed 11 Nov, 2020 15:01, edited 1 time in total.
Reason: Исправлено AWK_PATH на AWKPATH
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 9774
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 128 times
Been thanked: 267 times

Запускатель и PATHEXT

Post by HaRT »

Хм, однако где-то в другом месте команды может потребоваться как раз путь активной панели… Вот если бы был какой-то способ получить «наиболее полный» (насколько Фар в состоянии точно определить) путь запускаемого файла, это позволило бы удовлетворить оба сценария (из панелей и из комстроки).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 5903
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 11 times
Been thanked: 364 times

Запускатель и PATHEXT

Post by DrKnS »

HaRT wrote: Wed 11 Nov, 2020 14:59однако где-то в другом месте команды может потребоваться как раз путь активной панели…
Путь активной панели передается запускаемому процессу, так что он может им воспользоваться, если иного не указано (что, вроде бы, и так везде по умолчанию).
Вот если бы был какой-то способ получить «наиболее полный» (насколько Фар в состоянии точно определить) путь запускаемого файла
Единственный случай, когда можно точно определить - это когда вы запускаете с панели по Enter, и именно поэтому только там исторически и работали ассоциации.
В целом, в комстроке от ассоциаций больше хаоса, чем пользы, поэтому у меня есть большое желание объявить начатый в 4723 эксперимент завершенным и удалить их окончательно.
User avatar
HaRT
Moderator
Posts: 9774
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 128 times
Been thanked: 267 times

Запускатель и PATHEXT

Post by HaRT »

DrKnS wrote: Wed 11 Nov, 2020 15:34 В целом, в комстроке от ассоциаций больше хаоса, чем пользы, поэтому у меня есть большое желание объявить начатый в 4723 эксперимент завершенным и удалить их окончательно.
Однако выше приведён вполне жизненный пример, когда скрипты в системе выполняются гуёвым движком, а внутри Фара — консольным. И очень хочется мочь запускать такую ассоциацию из комстроки без указания полного пути к скрипту. Т.е. чтобы скрипты можно было использовать как полноценный аналог EXE-файлов (что есть в Никсах).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 5903
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 11 times
Been thanked: 364 times

Запускатель и PATHEXT

Post by DrKnS »

HaRT wrote: Wed 11 Nov, 2020 15:42чтобы скрипты можно было использовать как полноценный аналог EXE-файлов (что есть в Никсах)
Я не очень понимаю, откуда пошло мнение, что скрипты прямо сейчас нельзя использовать как полноценный аналог EXE-файлов и при чем здесь никсы (где исполнятор вообще указывают прямо в скрипте).
Скрипты вполне могут лежать в %PATH%.
Системный запускатель их там найдет.
Если расширение есть в %PATHEXT% - то найдет, даже если вы расширение не укажете.

Все эти приседания с ассоциациями в примере выше нужны не для того, чтобы запускать скрипты без указания пути, а только чтобы переключаться между wscript и cscript.
Однако, это можно получить и более другими способами. Например, в HKСR\VBSFile\Shell\Open\Command\@Default по умолчанию "%SystemRoot%\System32\WScript.exe" "%1" %*. Вы можете заменить это на, скажем, "%SystemRoot%\System32\%VBS_TYPE%Script.exe" "%1" %* и создать системную переменную VBS_TYPE=W, а в фаре переопределять ее как VBS_TYPE=C. Можно вообще написать обертку, делегирующую исполнение скрипта wscript или cscript в зависимости от того, есть ли у родительского процесса консоль и ассоциировать *.vbs с ней.
User avatar
John Doe
Бюрократ
Posts: 13233
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 335 times

Запускатель и PATHEXT

Post by John Doe »

DrKnS wrote: Wed 11 Nov, 2020 15:34 В целом, в комстроке от ассоциаций больше хаоса, чем пользы, поэтому у меня есть большое желание объявить начатый в 4723 эксперимент завершенным и удалить их окончательно.
Плотно использую эту функциональность для исполнения lua-скриптов и очень не хочу чтобы она была удалена.
При этом принципиально чтобы ассоциации были не системными, а именно фаровскими.
https://t.me/FarManager — Telegram чат
User avatar
Smitis
Posts: 1654
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 times

Запускатель и PATHEXT

Post by Smitis »

DrKnS wrote: Wed 11 Nov, 2020 16:45 Если расширение есть в %PATHEXT% - то найдет, даже если вы расширение не укажете.
Но это только в том случае, если расширение есть в системных ассоциациях. А если нет - не сработает. И если PATHEXT можно установить при запуске ФАРа (из _macroinit.lua), то с ассоциациями беда. Вносить изменения в систему, даже для текущего пользователя не всегда желательно, например на чужой машине. Пример с lua выше. Или тот же PowerShell - по умолчанию он вообще не выполняется, а ps1 даже в pathext не присутствует, а из ФАРа сейчас отлично выполняется, причём даже та версия (7-я), которая в системе вообще не установлена.
Разум когда-нибудь победит.
User avatar
DrKnS
Posts: 5903
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 11 times
Been thanked: 364 times

Запускатель и PATHEXT

Post by DrKnS »

Hyrum's Law во всей красе.

Идея понятна, осталось придумать, что делать.
Если вас устраивает ситуация "ассоциации в комстроке работают при указании: 1. расширения; 2. пути, если запускаемый файл не в текущем каталоге" - ассоциации можно оставить в текущем виде. Запуск ассоциаций без указания расширения и запуск ассоциаций из %path% при этом отваливаются, увы.
User avatar
Smitis
Posts: 1654
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 times

Запускатель и PATHEXT

Post by Smitis »

DrKnS, а нельзя ли сделать, если, скажем снята "Use Windows registered types", оставить по-старому, а если установлена, значит человек желает, что бы было "как в винде" и там уже по-новому? ShiftEnter всегда по-новому.
Last edited by Smitis on Wed 11 Nov, 2020 20:32, edited 1 time in total.
Разум когда-нибудь победит.
User avatar
DrKnS
Posts: 5903
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 11 times
Been thanked: 364 times

Запускатель и PATHEXT

Post by DrKnS »

Smitis, "Use Windows registered types" - это про нажатие Enter на файлах в панели. Оно никогда не влияло на комстроку. Если сделать так, чтобы влияло, то наверняка это поломает привычки кому-то еще. Возможно, даже вам.

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

Может "искать, если указано расширение, которое нашлось в ассоциациях"?
Пример:
testvbs.vbs - если есть ассоциация *.vbs, то поиск и запуск ассоциации.
testvbs - уходит в ОС как есть.

Код, который комбинаторно перебирает path и pathext - не самое худшее, что там есть.
Я не против его оставить для обработки только ассоциаций, но не хотелось бы, чтобы он вызывался на каждый чих.
User avatar
DrKnS
Posts: 5903
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 11 times
Been thanked: 364 times

Запускатель и PATHEXT

Post by DrKnS »

Кроме того, есть еще вариант.

Билд по ссылке выше работает следующим образом:
- Производится попытка запустить то, что вы ввели, системными средствами.
- Если попытка не удалась, запускается cmd и команда передается ему.
- Путь к cmd и параметры задаются в настройках, как раньше.

Иными словами, если хочется ручного поиска определенных файлов в определенных местах и запуска их способом, отличным от стандартного, то вызов cmd можно заменить чем-то своим, хоть луа-скриптом, который где надо посмотрит и если нашел - запустит, а иначе передаст дальше в настоящий cmd. Изменений в ОС не требуется.

При необходимости можно возможность препроцессинга введенной команды и в API добавить.
User avatar
HaRT
Moderator
Posts: 9774
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 128 times
Been thanked: 267 times

Запускатель и PATHEXT

Post by HaRT »

DrKnS wrote: Wed 11 Nov, 2020 21:23Может "искать, если указано расширение, которое нашлось в ассоциациях"?
Пример:
testvbs.vbs - если есть ассоциация *.vbs, то поиск и запуск ассоциации.
testvbs - уходит в ОС как есть.
Я за этот вариант.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Smitis
Posts: 1654
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 times

Запускатель и PATHEXT

Post by Smitis »

DrKnS wrote: Wed 11 Nov, 2020 21:23 кроме того, такой вариант означал бы, что запуская абсолютно любой exe, фар все равно бы шарился по разным местам файловой системы в надежде найти там что-то, к чему можно применить ассоциацию.
Согласен, с этой настройкой погорячился.
Может "искать, если указано расширение, которое нашлось в ассоциациях"?
Тут теряется вся фишка командной строки - ввели команду без расширения, ФАР нашёл первое подходящее и выполнил. Не надо помнить, на чём там было написано, cmd, btm, vbs, js, ps1, lua, py... В принципе, как в системе, только со своими ассоциациями.
если хочется ручного поиска определенных файлов в определенных местах и запуска их способом, отличным от стандартного, то вызов cmd можно заменить чем-то своим, хоть луа-скриптом
Как вариант, на lua (кстати, когда-то делали, но потом почему-то отказались).
Last edited by Smitis on Thu 12 Nov, 2020 07:58, edited 3 times in total.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1654
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 47 times

Запускатель и PATHEXT

Post by Smitis »

DrKnS wrote: Wed 11 Nov, 2020 21:25 - Производится попытка запустить то, что вы ввели, системными средствами.
Только лучше наоборот, сначала lua, а потом системными средствами.
Разум когда-нибудь победит.
Post Reply

Return to “Обсуждение Far Manager”