User Menu: SET не присваивает переменной значение

Столкнулись с проблемой в использовании Far? Здесь можно получить помощь.
textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Wed 01 Jun, 2016 16:07

Какой-то глюк в меню: пытаюсь составить сложную командную строку с параметрами, присвоив предварительно значение переменным, но столкнулся с каким-то глюком: SET некоторым переменным присваивает значения, а некоторым - нет. Если вместо SET подставить ECHO, то все отрабатывает нормально (переменные раскрываются и подставляются их значения), если использовать SET, то переменная вообще не инициализируется (последующий вызов ECHO вместо значения переменной печатает ее имя в процентах, например %variable% вместо значения).

Вот из файла меню:

Code: Select all

    set percent=50
    IF NOT "%percent%"=="" SET resize= -resize %percent% %percent% -rtype lanzos
    IF "%percent%" NEQ "" SET resizeInfo=rsz=%percent%%,
    set quality=!?Quality (1..100):?80!
    echo percent==%percent%    resize==%resize%   resizeInfo==%resizeInfo%   quality=%quality%
    echo  %resize%  -q %quality%
Выводит следующее:

Code: Select all

percent==50    resize==%resize%   resizeInfo==%resizeInfo%   quality=80
 %resize%  -q 80
[/color]
ECHO вместо SET:

Code: Select all

    set percent=50
    IF NOT "%percent%"=="" ECHO resize= -resize %percent% %percent% -rtype lanzos
    IF "%percent%" NEQ "" ECHO resizeInfo=rsz=%percent%%,
    set quality=!?Quality (1..100):?80!
    echo percent==%percent%    resize==%resize%   resizeInfo==%resizeInfo%   quality=%quality%
    echo  %resize%  -q %quality%
Выводит следующее:

Code: Select all

resize= -resize 50 50 -rtype lanzos
resizeInfo=rsz=50%,
percent==50    resize==%resize%   resizeInfo==%resizeInfo%   quality=80
 %resize%  -q 80
[/color][/bgcolor]
Так как же заставить SET работать в User Menu?

PS:Win7,Far 2.0/bld1807

User avatar
HaRT
Moderator
Posts: 9088
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 90 times
Been thanked: 159 times

User Menu: SET не присваивает переменной значение

Post by HaRT » Wed 01 Jun, 2016 16:17

textExpanser wrote: как же заставить SET работать в User Menu?
Перенести весь набор команд в CMD-файл и вызывать его.
Фар есть инструмент, а не нянька. © 2009 DrKnS

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Wed 01 Jun, 2016 16:24

HaRT wrote:Перенести весь набор команд в CMD-файл и вызывать его.
Не подходит, потому что bat-файл для каждого пункта меню создавать никуда не годится. Это нужно делать встроенными средствами, для чего они и делались, иначе вообще в чем был смысл встраивания скрипта в само меню.

Хочется все же разобраться - это я что-то делаю не так, или это глюк, а если глюк, то можно ли и как его обойти встроенными возможностями Far, а не внешними.
И - почему вообще это происходит?

User avatar
DrKnS
Posts: 5397
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 227 times

User Menu: SET не присваивает переменной значение

Post by DrKnS » Wed 01 Jun, 2016 19:11

textExpanser wrote: встроенными возможностями Far
Far - не командный процессор.
Используйте cmd-файл.

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Wed 01 Jun, 2016 19:37

cmd-файл можно и без Far использовать. А Far безусловно именно командный процессор (в смысле менеджмента и отдачи команд).

Или Вы считаете, что это функционал нужно из меню убрать?..

User avatar
HaRT
Moderator
Posts: 9088
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 90 times
Been thanked: 159 times

User Menu: SET не присваивает переменной значение

Post by HaRT » Wed 01 Jun, 2016 19:51

DrKnS wrote: Far - не командный процессор
Однако я вижу здравое зерно в жалобах textExpanser.
Фар одни команды из набора выполняет сам, а другие — порождённым %ComSpec%ом, притом, похоже, на каждую строчку новым. Если это так, то не разумнее ли было бы, чтобы Фар перед выполнением последовательности команд смотрел, может ли он их все выполнить сам, и если нет, выполнял бы их все порождённым интерпретатором (притом одним экземпляром) — чтобы в результате не было таких противоречий, на которые указывает топикстартер?
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
DrKnS
Posts: 5397
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 227 times

User Menu: SET не присваивает переменной значение

Post by DrKnS » Wed 01 Jun, 2016 21:47

HaRT wrote: чтобы Фар перед выполнением последовательности команд смотрел, может ли он их все выполнить сам, и если нет, выполнял бы их все порождённым интерпретатором
...и этим поломал все сценарии, в которых внешние команды сочетаются с чем-то сугубо far-specific, да-да:

Code: Select all

cd !??!
dir /b > out
tmp:out
del out

User avatar
HaRT
Moderator
Posts: 9088
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 90 times
Been thanked: 159 times

User Menu: SET не присваивает переменной значение

Post by HaRT » Wed 01 Jun, 2016 21:59

DrKnS wrote: ...и этим поломал все сценарии, в которых внешние команды сочетаются с чем-то сугубо far-specific
Хм, да, об этом я как-то не подумал.
Фар есть инструмент, а не нянька. © 2009 DrKnS

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Wed 01 Jun, 2016 22:17

Можно проверять наличие tmp:
А еще можно опцию добавить, т.е. запустить во внешнем временном скрипте
Или придумать и добавить какой-то способ передачи значений переменных между строками скрипта

Если бы я с этим сталкивался один-два раза, то не пошел бы писать тему. Но так как мистика происходит регулярно, то делать все новые и новые внешние скрипты для новых пунктов меню уже чересчур.
Last edited by textExpanser on Wed 01 Jun, 2016 22:36, edited 1 time in total.

Yegor
Posts: 1029
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 8 times
Been thanked: 19 times

User Menu: SET не присваивает переменной значение

Post by Yegor » Wed 01 Jun, 2016 22:26

А если извратиться?

Пример farmenu.ini

Code: Select all

1:  Test CMD
    echo @echo off >temp.cmd
    echo echo test >>temp.cmd
    echo set quality=!?Quality (1..100):?80! >>temp.cmd
    echo echo %quality% >>temp.cmd
    temp.cmd
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Wed 01 Jun, 2016 22:43

Да, это можно попробовать, спасибо. Еще бы в Far сделать стандартный временный буфер для таких вещей, например

Code: Select all

echo %somevar%>>:clipbuf:
где Фар сам подставлял бы временный файл или что-то другое (но не загаживая системный Clipboard).

User avatar
HaRT
Moderator
Posts: 9088
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 90 times
Been thanked: 159 times

User Menu: SET не присваивает переменной значение

Post by HaRT » Wed 01 Jun, 2016 23:17

textExpanser wrote: Еще бы в Far сделать стандартный временный буфер для таких вещей
Зачем?

Code: Select all

_:  Test
    set P=%TEMP%\FarMenu42.cmd
    echo @echo %0 %* "It can be any command" >> %P%
    %P% "There can be any parameters"		
    del %P%
Фар есть инструмент, а не нянька. © 2009 DrKnS

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Sat 04 Jun, 2016 21:42

...
А еще лучше - сделать несколько буферов, типа :clipbuf0:, :clipbuf1:, ... :clipbuf9:
HaRT wrote:
textExpanser wrote: Еще бы в Far сделать стандартный временный буфер для таких вещей
Зачем?

Code: Select all

....[/quote] Например затем, что количество строк с командами в меню сильно ограничено.
Кстати, интересно, что здесь Ваша команда SET нормально отработала и значение переменной P в следующих строках отработало. Но переменные запоминаются не всегда - SET работает нестабильно (см. выше, с чего начался тред). 

Возможно, встроенный в Far интерпретатор может запоминать простейшие переменные после исполнения строки, но не может передавать для SET предыдущие переменные в строку на исполнение?
Или когда SET предваряется какой-то другой командой, типа IF ?

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Sat 04 Jun, 2016 22:09

Нашел ещё один баг встроенного интерпретатора в меню:
неправильно обрабатывается следующий формат команды SET:
SET "B=BBB"
Вместо переменной B , здесь присваивается значение переменной "B (!)

Code: Select all

set "B=BBB"
echo «B» == %B%
echo «"B» == %"B%
pause
В .bat/cmd файле отрабатывает как надо:
«B» == BBB
«"B» ==

А вот из меню нет:
«B» == %B%
«"B» == BBB"


То есть либо это неправильная интерпретация Фаром команды SET (далеко не по стандарту), либо какой-то глюк.

Smitis
Posts: 1593
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 35 times

User Menu: SET не присваивает переменной значение

Post by Smitis » Sat 04 Jun, 2016 22:59

textExpanser wrote:далеко не по стандарту
А где можно посмотреть этот "стандарт"? То, что командный процессор может обрабатывать set "var=value" я в курсе, но это больше похоже на недокументированную фичу. И, кстати, в autoexec.bat set обрабатывается похожим с ФАРом образом.
Разум когда-нибудь победит.

textExpanser
Posts: 74
Joined: Wed 11 Apr, 2007 18:23

User Menu: SET не присваивает переменной значение

Post by textExpanser » Tue 07 Jun, 2016 01:11

Этот стандарт - консольные команды Windows.
И, IMHO, если уж делать, так чтобы не вызывало проблем.

Post Reply

Return to “Нужна помощь”