View Issue Details

IDProjectCategoryView StatusLast Update
0002442Far ManagerCommand Line/Executepublic2013-08-22 11:15
ReporterSmitis Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0002442: Добавить поддержку TakeCommand
DescriptionФАР, передавая командную строку на выполнение командному процессору, заключает её в кавычки. Выяснилась несовместимость такого подхода при использовании TCC - в некоторых случаях интерпретация такой, заключённой в кавычки, командной строки вызывает ошибку или результат, отличный от CMD. Опыт показывает, для получения одинаковых (в пределах их совместимости) результов, для CMD комстроку лучше всегда заключать в кавычки, а для TCC не заключать никогда.

Предлагаю следующее:
- Добавить строковую опцию System.Executor.NotQuotedShell, в которой будут перечислены имена исполняемых файлов командных процессоров, для которых командную строку не надо заключать в кавычки.
- В параметрах System.Executor.BatchType и System.Executor.ExcludeCmds раскрывать переменные среды (для возможности гибкой настройки при запуске из-под разных командных процессоров).
- При запуске проверять текущий %comspec% - если exe-файл есть в списке NotQuotedShell, в кавычки не заключать.

Предлагаю опробованый вариант решения в виде diff файла (используется постоянно под разными командными процессорами, последняя модифицированная версия - 3489)
Additional InformationОбсуждение http://forum.farmanager.com/viewtopic.php?f=6&t=8019
TagsNo tags attached.
Build3614

Activities

Smitis

2013-07-03 17:58

reporter  

executor.diff.7z (1,217 bytes)

2useven10

2013-07-03 21:48

developer   bugnote:0011243

для хэлпа тоже нужен патч.

Smitis

2013-07-04 06:39

reporter  

executor_help.7z (894 bytes)

Smitis

2013-07-04 06:39

reporter   bugnote:0011244

сделал

vskirdin

2013-07-06 05:52

administrator   bugnote:0011251

Эээ... может тогда сюда добавить ататч для tcc, аналогичный addons\SetUp\Executor.CMD.farconfig ?

Smitis

2013-07-06 13:34

reporter   bugnote:0011252

В принципе, есть конфиг для TCCLE.
Сейчас сделаю для полного TCC.

Сами конфиги из Addons требуют доработки:
- Содержат уже несуществующий System.Executor.Type
- Executor.COMMAND.farconfig, видимо, уже совсем не актуален в связи с тем, что 9x не поддерживается.
- Executor.4NT.farconfig, пожалуй, тоже не актуален, так как давно уже переименован в TCC
- Для CMD есть новая (с Висты) команда MKLINK.
- Для CMD: ERRORLEVEL, EXIST и NOT не являются командами.

Smitis

2013-07-06 17:40

reporter  

executor.farconfig.7z (1,801 bytes)

Smitis

2013-07-06 17:50

reporter   bugnote:0011253

Добавил файлы конфигурации для CMD, TCC/LE и TCC.
Для сравнения, количество команд получилось, соответственно 41 / 108 / 185 (а для TCC/LE и TCC пришлось ещё добавить варианты команд, ничинающихся с *)
Надеюсь, ничего не пропустил.
Все файлы в UTF-8 (в оригинале почему-то 1251).
Для TCC/LE и TCC добавлен параметр System.Executor.BatchType

2useven10

2013-07-06 18:39

developer   bugnote:0011254

BatchType это немного не о том (возможно название не очень удачное).
Фактически это то что по Enter будет исполняться в консольном окне фар.
Здесь вполне может быть .pl, .py, .lua, здесь же может быть и .btm, если ftype и assoc прописаны, даже если COMSPEC=CMD.EXE

Smitis

2013-07-06 22:16

reporter   bugnote:0011255

Last edited: 2013-07-06 23:00

Да, но по умолчанию BatchType = .bat;.cmd.
У TCC добавляется ещё один тип: .btm

Там вообще запутано получается. Если нажали ENTER и нет ФАРовской ассоциации, но расширение есть в BatchType, ищется ассоциация в реестре. Если введено в командной строке и расширение есть в BatchType, строка передаётся ком. процессору, ассоциации в реестре не ищутся, ком. процессор уже сам разбирается, что с таким файлом делать.

vskirdin

2013-08-14 15:09

administrator   bugnote:0011333

build 3611

Smitis

2013-08-15 06:49

reporter   bugnote:0011334

Тестю.
Можно немного сократить код, если использовать функцию PointToName:
заменить
        LPCWSTR lpCmdProcName = wcsrchr(strComspec.c_str(),L'\\');
        if (lpCmdProcName != nullptr)
            lpCmdProcName++;
        bool bQuotedShell = !(std::any_of(CONST_RANGE(NotQuotedShellList, i) { return !StrCmpI(i,lpCmdProcName); }));
на
        bool bQuotedShell = !(std::any_of(CONST_RANGE(NotQuotedShellList, i) { return !StrCmpI(i,PointToName(strComspec.data())); }));

В мой diff это не попало, потому что я эту возможность после нашёл. Но в своих патчах использовал, решение рабочее.

vskirdin

2013-08-15 09:03

administrator   bugnote:0011335

build 3614

Smitis

2013-08-18 07:44

reporter   bugnote:0011340

Глюков не замечаю. Работает как задумано. Закрываем.

Issue History

Date Modified Username Field Change
2013-07-03 17:58 Smitis New Issue
2013-07-03 17:58 Smitis File Added: executor.diff.7z
2013-07-03 21:48 2useven10 Note Added: 0011243
2013-07-04 06:39 Smitis File Added: executor_help.7z
2013-07-04 06:39 Smitis Note Added: 0011244
2013-07-06 05:52 vskirdin Note Added: 0011251
2013-07-06 13:34 Smitis Note Added: 0011252
2013-07-06 17:40 Smitis File Added: executor.farconfig.7z
2013-07-06 17:50 Smitis Note Added: 0011253
2013-07-06 18:39 2useven10 Note Added: 0011254
2013-07-06 22:16 Smitis Note Added: 0011255
2013-07-06 23:00 Smitis Note Edited: 0011255
2013-08-14 15:09 vskirdin Note Added: 0011333
2013-08-14 15:09 vskirdin Assigned To => vskirdin
2013-08-14 15:09 vskirdin Status new => feedback
2013-08-15 06:49 Smitis Note Added: 0011334
2013-08-15 06:49 Smitis Status feedback => assigned
2013-08-15 09:03 vskirdin Note Added: 0011335
2013-08-15 09:03 vskirdin Status assigned => feedback
2013-08-18 07:44 Smitis Note Added: 0011340
2013-08-18 07:44 Smitis Status feedback => assigned
2013-08-22 11:15 alexy Build => 3614
2013-08-22 11:15 alexy Status assigned => closed
2013-08-22 11:15 alexy Resolution open => fixed
2013-08-22 11:15 alexy Fixed in Version => 3.0