Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Loonie
Зарегистрирован: 22.07.2003 Сообщения: 1
|
Добавлено: Вт Июл 22 2003 11:47 Заголовок сообщения: Командная строка Windows и её разбор |
|
|
Имеется командная строка абсолютно любого вида. Необходимо показать иконку её файла (с показом проблем не возникает). Господа, возникает огромный вопрос, как правильно разобрать строку в этом случае на параметры и путь к этому файлу, если строка вида 'calc First Second "Third parameter" '. Т. е. мне необходимо получить путь к файлу c:\windows\calc.exe. Помогите, никто на других форумах не может ответить на этот вопрос. Есть ли стандартные средства для решения этой задачи? Просьба, CreateProcess, FindExecutable не предлагать, т. к. они работают только с исполняемыми файлами (причем FindExecutable - с неассоциируемыми не работает). Также следует сказать, что мне не нужны советы относительно взятия командной строки текущего запущенного приложения с помощью GetCommandLine; представьте, что строка вводится в Edit. Если примером будет 'c:\windows\calc2', где calc2 - файл без расширения в директории windows - они не работают. Какие расширения проверяются, если оного не указано? Как правильно обрабатывать кавычки, которые считаются объединителями? За образец работы с командными строками предлагаю брать стандартный диалог Пуск->Выполнить. Вы, конечно, можете предложить сделать все вручную, но тогда возникает вопрос, а как разделить Path Environment Variable на отдельные директории? Это только в идеальном случае там директории разделены знаком ; А если полный путь к директории не указан? А если...?
Вопросов много. Пожалуста, помогите. На вопрос действительно не смог пока толково ответить никто.
Для тех, кто думает, что все так просто, пример 'C:\Program Files\Outlook Express\Msimn.exe First Second' в вышеупомянутом Пуск->Выполнить не работает. |
|
Вернуться к началу |
|
|
Aist++ Гость
|
Добавлено: Вт Июл 22 2003 14:13 Заголовок сообщения: Всё просто! |
|
|
1) Определяешь, на какой файл ссылаеться командная строка. Для этого: 1.1) Если строка начинаеться с кавычки, то ищешь в строке следующую кавычку. Теперь предполагаем, что строка между этими кавычками и есть запускаемый файл, остальное параметры. 1.2) Если строка начинаеться с любого другого символа, то ищешь первый пробел в строке. Запускаемый файл - от начала строки до этого пробела.
2) Копируем его в новую строку так, чтобы строка содержала запускаемый файл
3) Теперь мы должны выполнить поиск соответствующего файла в текущем каталоге. Для этого: 3.1) Выполнить поиск по той строке, которую мы только что получили 3.2) Если не найдено, повторить но с расширением .exe 3.3) Если не найдено, повторить но с расширением .сом 3.4) Если не найдено, повторить но с расширением .bat 4) Если файл так и не найден, то выполнить поиск в каталогах, указанных в PATH. Для этого 4.1) Если PATH начинаеться с кавычки, искать следующую кавычку. Между ними и будет имя каталога 4.2) Если с другого символа, то ищешь ";" 4.3) Выполняешь поиск, как в пунктах 3.1-3.4
Вроде всё, если что, обращайся. Может я вопрос не правильно понял. Но расскажу что знаю! |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Вт Июл 22 2003 15:33 Заголовок сообщения: Re: Командная строка Windows и её разбор |
|
|
1. Ищешь первый "\", начиная с конца строки. Если есть, запоминаешь номер символа (пусть будет num), иначе ищешь первый ":" начиная с конца строки. Если есть, запоминаешь номер символа (пусть опять будет num), иначе num=0. Подстрока с 1-го символа по num-ый -- путь. Если путь начинается с кавычек, их можно убрать. (Назовём cPath.) Подстрока с (num+1)-го символа до конца строки -- файл с аргументами. (Назовём cCmd.)
2.1. В cCmd ищем ".exe", начиная с начала. Если найдено, запоминаем номер символа "." (пусть будет no), иначе ищем ".dll". Если найдено, запоминаем номер символа "." (пусть опять будет no), иначе ищем... Так проверяем все интересующие расширения. (Иконки только в .exe и .dll, но в общем случае, нужно проверять ".com", ".bat", ".cmd", ".ocx" и т. д., то есть то, что в конкретной винде является исполняемым файлом.) Если найдено, то подстрока cCmd с 1-го символа по (no+3)-ый -- имя файла (назовём cFile), иначе no=0.
2.2. Если no==0 в cCmd ищем пробел, начиная с начала. Если найдено, запоминаем номер (пусть опять будет no), иначе ищем табуляцию, начиная с начала. Если найдено, запоминаем номер (пусть опять будет no). Если найдено, то подстрока cCmd с 1-го символа по (no-1)-ый+".exe" -- имя файла (назовём cFile), иначе no=0.
3. Если no==0, то неправильная команда, иначе cPath+cFile -- требуемое полное имя файла.
Кажется, всё. |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Вт Июл 22 2003 15:48 Заголовок сообщения: Нет, не все. |
|
|
Моим способом ищешь имя файла и путь. Если путь оказывается пустым, а файл исполняемым (не длл-кой), то способом Aist++ 22-07-2003 15:13 проходишь по путям в переменной path в поисках этого файла. Если путь содержит только диск, то находишь текущий каталог на этом диске и -- диск+текущий каталог+файл == искомый файл. Иначе путь задан. Далее. Если путь начинается не с диска, но с "\", то находишь текущий диск и -- текущий диск+путь+файл == искомый файл. Если путь начинается не с диска и не с "\", то находишь текущий каталог и текущий диск и -- текущий диск+текущий каталог+путь+файл == искомый файл.
Теперь всё. |
|
Вернуться к началу |
|
|
|