Решил поделиться со всеми вами определенной информацией, а также спросить совета знающих.
Потребовалось запустить внешний exe файл. С помощью канала Call типа Exec данное действие успешно реализуется. Но! внешнее приложение - программа нашего программиста, и для ее успешного старта требуется обнаружение (ею самой) нескольких файлов в родной директории. При запуске с ТМ программа ругается на то, что не может запуститься, ибо не видит того, сего и третьего. Ладно, оставим это на совести разработчика, так как я нашел другое вполне приемлемое решение (так мне казалось сначала): запустить батник, который уже в свою очередь запустит исполняемое приложение.
Вызов происходит по нажатию кнопки и записи 1 в канал.
Все успешно загружается (и в cmd.exe и в ТМ)...
Однако проблема в том, что путь до start.bat на самом деле другой и содержит пробелы! Раз пробелы есть, значит надо ставить кавычки, скажете вы и будете правы. Пробуем:
Прошу обратить внимание, что в командной строке (на чем я и тестировал) все работает, то есть тест я проводил следующим образом:
cmd /k "c:\program files\ckyokean\start.bat" - так работает
Ладно, я подумал, что может ТМ ставит кавычки при перенесении комментария и без них не будет работать. Добился работоспособности в cmd.exe следующим образом:
cmd "/k ""c:\program files\ckyokean\start.bat"
- все работает. Перенес в комментарий строку
"/k ""c:\program files\ckyokean\start.bat"
- не работает!
Пробовал и так:
"/k ""c:\program files\ckyokean\start.bat"""
и так (уже показывал):
/k "c:\program files\ckyokean\start.bat"
- не работает.
Собственное вопрос такой, каким образом ТМ формирует строку запуска exe файла (в моем случае это cmd.exe) и передачу аргументов файлу? С кавычками или без? Как заставить работать данную схему в случае, когда путь к файлу указан с пробелами.
P.S. В большинстве случаев ошибка такая: 'C:\Program' is not recognized as an internal or external command,operable program or batch file.
Posted by Romсheg (Участник № / Member № 3792) on :
ТМ6 вообще не управляет папками, поэтому при запуске внешнего ПО в системе текущей папкой всегда является папка узла, который запустили в рантайме. Совет вашему программисту - пусть прописывает в явном виде пути к своим конфигам, иначе ТМ ему все это перевернет. Вообще насчет запуска внешнего - тут правила такие (некоторые по личному опыту): 1) Пути с пробелами - берите в кавычки 2) Старайтесь избегать длинный путей - ТМ не умеет работать с длинными путями более 39 символов. Старайтесь даже сам ТМ не ставить в директорию по умочанию, чем ближе положешь, тем быстрее возьмешь (в смысле проще потом работать будет и настраивать). 3) Замечен такой интересный факт - в некоторых случаях приложение приходилось по имени приводить к 8-символьному формату, потому как длинное имя ехе-шника не воспринималось ни в какую. 4) Все что запускаете из проекта - лучше кладите в отдельную папку, путь к которой прописывайте в PATH, так проще и проект потом будет настроить и вообще не мучиться с путями, потому как они будут уже на уровне самой ОС.
Posted by Сергей Александрович (Участник № / Member № 2884) on :
Romсheg, спасибо за комментарии.
Да, я уже понял, что текущая директория устанавливается самим TM, так что тут все понятно. 1) Так вот и не получается тут эта схема, причем в CMD.EXE все работает, а в ТМ видимо своя особенность. Все таки хотелось видеть комментарий группы разработки. 2) Соглашусь, хотя обычно ставлю в директорию по-умолчанию, так как считаю, что программы должны корректно работать и с пробелами и с длинными путями (раз уж в инсталляторе такой путь прописан). Кроме того, путь установки наших программ (а здесь инсталлятор) тоже имеет в себе "Program Files". Но, если не получится заставить работать в таком варианте, придется ставить в папку C:\TraceMode\ 3) Такой вариант не пробовал, но если ничего не останется, ...
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
CALL_EXEC. Запуск bat-файлов. a. ПАРАМЕТР=1 b. Имя канала=C:\Windows\System32\cmd.exe c. Комментарий=/c start <путь>\<name>.bat d. Последней строкой в bat-файле должна быть: EXIT.
Posted by Сергей Александрович (Участник № / Member № 2884) on :
Попробовал. Не работает.
Пробовал следующие варианты:
1. Комментарий=/c start <путь с пробелами>\<name>.bat 2. Комментарий=/c start "<путь с пробелами>\<name>.bat" 3. Комментарий="/c start ""<путь с пробелами>\<name>.bat"
Ошибки разные. Не знаю, может у вас и получилось, но у меня не в какую.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Задайте путь без пробелов. Комментарий=/c start <путь без пробелов>\<name>.bat Перепроверено в релизе 6.07.
Posted by Сергей Александрович (Участник № / Member № 2884) on :
Так понятно, что будет работать без пробелов Я же это написал еще в первом сообщении. Ясно, что заставить работать это нельзя штатными средствами.
Выхода два: либо подключить DLL библиотеку, либо задать путь без пробела.
Спасибо за ответы.
Posted by Rinag (Участник № / Member № 4499) on :
Аналогичная задача по созданию Helpa. Сам Help в формате pdf. Acrobat Reader расположен в C:\Program Files\Adobe\Reader 9.0\Reader. Добывил в path=C:\Program Files\Adobe\Reader 9.0\Reader; C:\WINDOWS\system32. Прописал в CALC_EXEC Имя: AcroRd32.exe Комментарий: "help.pdf" Тип вызова: Exec Параметр:1 Период: 3 цикл CALC. У меня 2 вопроса, почему не запускается даже Acrobat reader, не говоря уж о том что сам файл не подгружается в нее. И как реализовать вызов по событию, мне не нравится, что канал вечно с периодом 3 calc крутится в памяти.
Posted by Rinag (Участник № / Member № 4499) on :
Экмперементировал и с cmd.exe. Пока не пропишу весь путь к нему или не положу cmd.exe в корень узла, так же не запускается.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Почему ОС не запускает файлы при указании доступа к нми в переменной path, надо смотреть в настройках ОС. Trace Mode 6 передает в ОС имя файла, дальше - функции ОС.
Чтобы функция запуска приложения не реализовывалась с каждым своим периодом, сделайте канал CALL.EXEC типа OUT и запускайте ее интерактивно или программно.
Posted by Romсheg (Участник № / Member № 3792) on :
2AdAstra Technical Support: В том и дело, что в ОС некорректно строку запуска передает сам ТМ6.
[ 07.07.2011, 17:33: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В данном случае речь идет о передаче в ОС запускаемого файла без указания пути.