Что нового

Фильтрация символов в командах

autoall

Новичок
Сообщения
21
Репутация
0
Приветствую всех!

Написал я скрипт для себя. Скрипт делает следующее: подгружает из текстового файла строчки, в которых указаны пути к запуску программ, создаётся форма с кнопочками, по нажатию которых запускается та или иная программа. Вроде как и ничего сложного. Пришлось посидеть, конечно, что бы количество кнопок автоматом определялось и выводилось исходя из кол-ва строк из файла.

Столкнулся я с такой проблемой. Если в текстовой строке рписутствует значет &, то ничего не работает. Ниже привожу примеры.
Код:
$Button1 = GUICtrlCreateButton("AA & ZZ", 50, 20, 100, 32)

- создастся кнопка с надписью "AA ZZ".

Код:
Run("c:\prog\aa&zz\aa_zz.exe")

- не запускается, причём именно из-за наличия злополучного &.

И если в первом случае как-то попытаться & заэкранировать, например если написать "AA && ZZ", то на кнопке появится надпись "AA & ZZ", то во втором случае вообще ничего не помогает.

Можно как-то по-нормальному из этой ситуации вывернуться?

Решение.
1) При выводе надписи на кнопке символ "&" преобразуется в нижнее подчеркивание. Но после запуска скомпилированного скрипта подчеркивания нет. Тема заведена в багтрекере.
2) Программы с символом "&" в пути запуска - запускаются.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
autoall [?]
кнопка с надписью "AA ZZ"
На самом деле надпись на кнопке "AA _ZZ", т.к. & служит для подчёркивания следующего за ним символа

На Win7 x86 прекрасно запускается. Проверьте правильность пути
Код:
FileExists("c:\prog\aa&zz\aa_zz.exe")
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Лучше проверте кодировку файла скрипта, бывают разные курьёзы связаные с тем что кодировка скрипта не та
 
Автор
A

autoall

Новичок
Сообщения
21
Репутация
0
Так! Я все гоняю на Win8.1x64. На Win7/XP не пробовал, попробую.

На самом деле надпись на кнопке "AA _ZZ", т.к. & служит для подчёркивания следующего за ним символа
У меня нет подчеркивания, просто пробел. Может из-за Win8?

Привожу код, может что с массивами связано?

Код:
HotKeySet("{ESC}", "fn_Exit")

$but = 1
$but_max = $param[0][0]
Local $Button[$but_max+1]

GUICreate("ProgPanel 1.0", 160, 60*($but_max+1))

While $but <= $but_max
	GUICtrlCreateIcon($param[1][$but], 0, 10, 10*$but + 40*($but-1), 32, 32)
	MsgBox(0,"",$param[0][$but])
	$Button[$but] = GUICtrlCreateButton($param[0][$but], 50, 10*$but + 40*($but-1), 100, 32)
	GUICtrlSetOnEvent(-1, "fn_Run")
	$but = $but + 1
WEnd

$Button[0] = GUICtrlCreateButton("Выход", 10, 10*($but) + 50*($but-1), 140, 32)
GUICtrlSetOnEvent(-1, "fn_Exit")

GUISetOnEvent(-3, 'fn_Exit')
GUISetState()

While 1
	Sleep(1000)
WEnd

Func fn_Run()
	for $i = 0 to $but_max
		if (@GUI_CtrlId = $Button[$i]) then
			Run($param[1][$i])
		endif
	next
EndFunc

Func fn_Exit()
    Exit
EndFunc


Функционал кода: из имеющегося массива загружаются названия для кнопок и пути для программ, для каждого значения создаётся иконка, радом - кнопочка, создание кнопочек - пока массив не закончится. Ну а далее по нажатию на кнопку вызывается функция, которая проверяет какая кнопка нажата и из массива подставляет значение в команду Run.
Массив:
$param[0][0] - кол-во записей
$param[0][х] - название для кнопки
$param[1][х] - команда, выполняемая при нажатии на кнопку

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

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
autoall [?]
Массив:
$param[0][0] - кол-во записей
$param[0][х] - название для кнопки
$param[1][х] - команда, выполняемая при нажатии на кнопку
У вас индексы перепутаны. Поэтому и пример у вас нерабочий. Правильно так
Код:
Массив:
$param[0][0] - кол-во записей
$param[х][0] - название для кнопки
$param[х][1] - команда, выполняемая при нажатии на кнопку
И ещё. Я могу сделать такие исходные данные, при которых всё будет запускаться на любых системах. Если у вас проблемы с определёнными символами, то предоставьте конкретный массив и рабочий пример для воспроизведения ошибки.
 
Автор
A

autoall

Новичок
Сообщения
21
Репутация
0
У вас индексы перепутаны. Поэтому и пример у вас нерабочий.
Нет, все верно. Это ж выдержка из примера - оно не может не работать, т.к. работает =)

Код:
Opt('GUIOnEventMode', 1)

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

$par_max = 100
Local $param[$par_max][$par_max]

$param[0][0] = 2
$param[0][1] = "Notepad"
$param[1][1] = "notepad.exe"
$param[0][2] = "CALC A & B"
$param[1][2] = "c:\A&B\calc.exe"

HotKeySet("{ESC}", "fn_Exit")

$but = 1
$but_max = $param[0][0]
Local $Button[$but_max+1]

GUICreate("ProgPanel 1.0", 160, 60*($but_max+1))

While $but <= $but_max
	GUICtrlCreateIcon($param[1][$but], 0, 10, 10*$but + 40*($but-1), 32, 32)
	$Button[$but] = GUICtrlCreateButton($param[0][$but], 50, 10*$but + 40*($but-1), 100, 32)
	GUICtrlSetOnEvent(-1, "fn_Run")
	$but = $but + 1
WEnd

$Button[0] = GUICtrlCreateButton("Выход", 10, 10*($but) + 50*($but-1), 140, 32)
GUICtrlSetOnEvent(-1, "fn_Exit")

GUISetOnEvent(-3, "fn_Exit")
GUISetState()

While 1
	Sleep(10000)
WEnd

Func fn_Run()
	for $i = 0 to $but_max
		if (@GUI_CtrlId = $Button[$i]) then
			Run($param[1][$i])
		endif
	next
EndFunc

Func fn_Exit()
    Exit
EndFunc


Массив $param на самом деле мне передаётся другим скриптом из файла (да, я изобрел велосипед в свое время вместо того чтобы с ini разобраться!). Для упрощения, я массив вручную сейчас задал.

Теперь интересное.

1) Я был прав насчет подчеркивания, но только наполовину.
2) Я был неправ насчет незапуска программ (по команде запускался другой скопмилированный скрипт, который не находил файл параметров и посему не запускался, а файл параметров он не видит, т.к. рабочий каталог тот из которого запускается моя программа, а не тот, в котором лежит EXE).

Проверяю, приложенный выше, скрипт.
Запускаю скрипт - подчеркивания вижу! Тыкаю кнопки - все запускается.
Компилирую скрипт, запускаю полученный EXE - подчеркивнаия не вижу! Тыкаю кнопки - все запускается.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
autoall [?]
Компилирую скрипт, запускаю полученный EXE - подчеркивнаия не вижу!
На Win7 x86 такая же проблема.

По поводу перепутанных индексов - это я перепутал :smile: Просто привык к массивам формата "сто по два", а у вас "два по сто".
 
Автор
A

autoall

Новичок
Сообщения
21
Репутация
0
Фильтрация символа при выводе формы - это фигня, я этот знак на "+" поменяю и все. Но неприятно, конечно. Надо бы в багтрекере этот факт отобразить.
 
Верх