Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.01;
Скачать: CL | DM;

Вниз

Разбор командной строки на имя файла и параметры   Найти похожие ветки 

 
DVM ©   (2009-09-01 15:17) [0]

Понадобилась тут мне функция, которая бы разбивала строку на имя файла и параметры запуска. Вобщем то ничего сложного, но хотелось бы максимально приблизится к разбору строки к проводнику Windows.

Загвоздка вот в чем:
Проводник успешно стартует из автозагрузки строку:
C:\Program Files\Flashget\flashget.exe /min

Я никак не могу понять, как он понимает где здесь имя файла, где параметр? Кавычек нет, слеш в параметре тоже необязателен.


 
Skyle ©   (2009-09-01 15:18) [1]

ParamStr, ParamCount + F1?


 
DVM ©   (2009-09-01 15:23) [2]


> Skyle ©   (01.09.09 15:18) [1]

Читаем внимательно текст поста, мне не нужны параметры запуска моего приложения.


 
Rouse_ ©   (2009-09-01 15:23) [3]

имя файла ParamStr(0)

> слеш в параметре тоже необязателен

FindCmdLineSwitch()


 
clickmaker ©   (2009-09-01 15:24) [4]

> Проводник успешно стартует из автозагрузки строку:
> C:\Program Files\Flashget\flashget.exe /min

а C:\Program Files\Flashget\flashget /min ?


 
DVM ©   (2009-09-01 15:29) [5]


> Rouse_ ©   (01.09.09 15:23) [3]


> имя файла ParamStr(0)

Речь не идет о моей программе, я обрабатываю внешние строки из которых надо выделить путь и параметры.


> clickmaker ©   (01.09.09 15:24) [4]


> а C:\Program Files\Flashget\flashget /min ?

Типа такого он тоже обрабатывает нормально, вот строка которую он успешно обрабатывает:

%systemroot%\system32\dumprep 0 -k


 
tesseract ©   (2009-09-01 15:34) [6]


> вот строка которую он успешно обрабатывает:


%systemroot%  -это же переменная окружения :-)


 
Skyle ©   (2009-09-01 15:35) [7]

Может тогда что-нибудь типа
ExpandEnvironmentStrings + до второй кавычки или первого пробела?


 
DVM ©   (2009-09-01 15:38) [8]


> tesseract ©   (01.09.09 15:34) [6]


> %systemroot%  -это же переменная окружения :-)

а то я не знаю, дело то не в это


 
clickmaker ©   (2009-09-01 15:38) [9]

попробовал запустить из меню Run
C:\Program Files\Far\Far.exe /min

ругнулся, что не может найти C:\Program


 
DVM ©   (2009-09-01 15:39) [10]


> Skyle ©   (01.09.09 15:35) [7]


> ExpandEnvironmentStrings

Это само собой, но точно не до первого пробела или второй кавычки


 
DVM ©   (2009-09-01 15:40) [11]


> clickmaker ©

а у меня флешжет тем не менее запускается


 
DVM ©   (2009-09-01 15:40) [12]


> > clickmaker ©

из автозагрузки только


 
clickmaker ©   (2009-09-01 15:45) [13]

ну тогда напрашивается вариант, что если нет кавычек, то ищет до последнего слэша, а после него - до первого пробела


 
DVM ©   (2009-09-01 15:45) [14]

Путем эксперимента я кажется понял логику работы проводника в таких случаях.

1) Сначала он убирает кавычки
2) Разворачивает EnvironmentStrings
3) Идет от первого символа строки и плюсует их во временный буфер, каждый раз проверяя не накопилось ли в буфере имени существующего файла.

Но до такого метода он пытается разобраться со строкой по-хорошему, учитывая кавычки и т.д.


 
Rouse_ ©   (2009-09-01 15:47) [15]

FindExecutableImage()


 
Медвежонок Пятачок ©   (2009-09-01 15:48) [16]

каждый раз проверяя не накопилось ли в буфере имени существующего файла.

перебирая в том числе все папки %path% ?
сомнительно как-то


 
Anatoly Podgoretsky ©   (2009-09-01 15:58) [17]

> clickmaker  (01.09.2009 15:38:09)  [9]

Тоже правильно, имя не соответствует правилам именования.


 
Anatoly Podgoretsky ©   (2009-09-01 16:00) [18]

> clickmaker  (01.09.2009 15:45:13)  [13]

не правильно.

C:\Program files\filename1.ext  \folder\filename2.ext


 
DVM ©   (2009-09-01 16:03) [19]


> Anatoly Podgoretsky ©   (01.09.09 15:58) [17]

Правильно-неправильно, однако ж работает. Мне надо чтобы тоже работало.
Вообще непонятно. кто пошел у кого на поводу, то ли MS подстроилась к кривым программам, создающим кривые записи в реестре, то ли программы эксплуатируют такое либерально отношение проводника, но проблемы определенные это создает.


 
clickmaker ©   (2009-09-01 16:12) [20]

> то ли MS подстроилась к кривым программам, создающим кривые
> записи в реестре

скорей всего
непонятно только, изначально ли был прицел на такую возможную кривизну, или уже "по просьбам трудящихся"


 
DVM ©   (2009-09-01 16:20) [21]


> clickmaker ©   (01.09.09 16:12) [20]

я думаю дело в том, что изначально длинных путей не было, и многие программы не задумываясь писали в реестр %systemroot%\proga.exe /param и проблем не было, после подстановки переменных окружения.

Но вот появились длинные пути. Надо было обеспечить совместимость ОС с такими программами. Программы писали все как и раньше, без кавычек (путь то без пробелов для них), а вот после замены переменных окружения он становился неверным, т.к могли появляться пробелы.


 
TIF ©   (2009-09-01 18:32) [22]


> Я никак не могу понять, как он понимает где здесь имя файла,
>  где параметр? Кавычек нет, слеш в параметре тоже необязателен.
>

Я, наверное и эту тему не понял o_O
А разве нельзя начать проверку с конца и остановиться на первом пробеле, после этого сказав - стоп! Всё что слева - путь, всё что справа - параметры
?


 
clickmaker ©   (2009-09-01 18:48) [23]

> А разве нельзя начать проверку с конца и остановиться на
> первом пробеле, после этого сказав - стоп! Всё что слева
> - путь, всё что справа - параметры

свежая мысль. Особенно, если учесть, что параметров может быть до хрена


 
TIF ©   (2009-09-01 19:12) [24]

> Особенно, если учесть, что параметров может быть до хрена

Ну, с учётом этого топать дальше, но закругляться, встретив обратный слеш \


 
Eraser ©   (2009-09-01 19:24) [25]

> [0] DVM ©   (01.09.09 15:17)

на сколько я понял, нужно чтобы работало аналогично "Выполнить"?


 
Anatoly Podgoretsky ©   (2009-09-01 19:39) [26]

> TIF  (01.09.2009 19:12:24)  [24]

слеша может и не быть.


 
TIF ©   (2009-09-01 19:52) [27]

> слеша может и не быть.

Это имеется в виду такой случай
myexe /a /b /c
?

Тут успешно доходим до начала строки, а оринтируемся на последний с конца (первый с начала) пробел

Название исполняемого файла с пробелом в имени не в счёт, в этом случае 100% нужны кавычки


 
DVM ©   (2009-09-01 19:55) [28]


> Eraser ©   (01.09.09 19:24) [25]


> на сколько я понял, нужно чтобы работало аналогично "Выполнить"?

Скорее так, как проводник отрабатывает ключ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

В случае с "выполнить" он не выполняет C:\Program Files\Far\Far.exe /min
А в случае чтения из реестра выполняет. Т.е. даже без кавычек.


 
DVM ©   (2009-09-01 19:56) [29]


> TIF ©   (01.09.09 19:52) [27]


> Название исполняемого файла с пробелом в имени не в счёт,
>  в этом случае 100% нужны кавычки

Ну ё-мое, ты это проводнику объясни, что нужны. Но ему не нужны. И мне надо так.


 
DVM ©   (2009-09-01 19:57) [30]


> Eraser ©   (01.09.09 19:24) [25]

Только мне выполнять ничего не надо, мне нужно имя файла и параметры отдельно.


 
Anatoly Podgoretsky ©   (2009-09-01 19:58) [31]

> TIF  (01.09.2009 19:52:27)  [27]

Может быть вариант

myexe myexe /a /b /c


 
Anatoly Podgoretsky ©   (2009-09-01 19:59) [32]

> DVM  (01.09.2009 19:55:28)  [28]

На Виста выполняет.


 
DVM ©   (2009-09-01 20:03) [33]

По всей видимости проводник действительно просматривает строку с конца, каждый раз отбрасывая по одному символу и проверяет, не является ли оставшаяся строка реально существующим исполняемым файлом.


 
TIF ©   (2009-09-01 20:04) [34]

> Может быть вариант myexe myexe /a /b /c

У меня "Выполнить" в Windows такого уже не понимает. Принимает за имя exe только первый myexe


 
Anatoly Podgoretsky ©   (2009-09-01 20:05) [35]

> DVM  (01.09.2009 19:56:29)  [29]

Так надо сначало оговорить условия, откуда берется список и где он применяется, точный формат списка и прочее.
Частные решения имеют, общего решения нет.


 
DVM ©   (2009-09-01 20:10) [36]


> Anatoly Podgoretsky ©


> Так надо сначало оговорить условия, откуда берется список
> и где он применяется

1) Список берется из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

2) Все программы из данного списка проводник успешно запускает.

3) Мне надо разобрать этот список на пары: Полный путь к файлу -> Параметры

Затык пока у меня только с длинными именами не заключенными в кавычки.


 
Anatoly Podgoretsky ©   (2009-09-01 20:13) [37]

> DVM  (01.09.2009 20:03:33)  [33]

Это хоть допустимый, но глупый алгоритм, проще слева направо и не символами, а словами.
Но нужен ответ на ранее заданый вопрос про условия применимости.


 
Anatoly Podgoretsky ©   (2009-09-01 20:15) [38]

> TIF  (01.09.2009 20:04:34)  [34]

Потому что второй myexe является параметром.


 
DVM ©   (2009-09-01 20:20) [39]


> Anatoly Podgoretsky ©   (01.09.09 20:13) [37]


> проще слева направо и не символами, а словами.

нет не проще, даже я бы сказал неправильно слева направо.

Пример:
Разбираем слева направо строку C:\Program Files\Folder\File /param
На каком то шаге мы должны проверить наличие исполняемого файла
C:\Program Files\Folder
Но в папке C:\Program Files\ может не оказаться подпапки Folder, но запросто может оказаться файл Folder.exe, который и будет выполнен - ОШИБКА!


 
Eraser ©   (2009-09-01 20:24) [40]

> [28] DVM ©   (01.09.09 19:55)


> В случае с "выполнить" он не выполняет C:\Program Files\Far\Far.exe
> /min

в висте и 7 выполняет.

///  <summary>Разделение командной строки на путь к файлу и параметры запуска</summary>
///  <param name="ACommandLine">Командная строка</param>
///  <param name="AFilePath">Путь к файлу</param>
///  <param name="AParams">Параметры запуска</param>
procedure SplitCommandLine(ACommandLine: string; var AFilePath, AParams: string);
var
 sFile, sParams: string;
 sSource: PWideChar;
 StringArray: TStringArray;
 I, J: Integer;
begin
 sFile := "";
 sParams := "";
 ACommandLine := Trim(ACommandLine);
 if FileExists(ACommandLine) then
 begin
   sFile := ACommandLine;
   sParams := "";
 end
 else
 begin
   // Ищем вхождение существующего файла.
   StringArray := Explode(" ", ACommandLine);
   for I := 0 to Length(StringArray) - 1 do
   begin
     sFile := Trim(sFile + " " + StringArray[I]);
     if FileExists(sFile) then
     begin
       // Файл найден, принимаем оставшуюся часть строки за параметры.
       for J := I + 1 to Length(StringArray) - 1 do
         sParams :=  Trim(sParams + " " + StringArray[J]);

       Break;
     end;
   end;

   if not FileExists(sFile) then
   begin
     // Если файл так и не удалось выделить.
     // Определяем, указаны ли ковычки.
     if Pos(""", sFile) = 1 then
     begin
       // Ковычки найдены, извлекаем путь с их учетом.
       sSource := PChar(sFile);
       sFile := SysUtils.AnsiExtractQuotedStr(sSource, Char("""));
       sParams := sSource;
     end
     else
     begin
       sFile := StringArray[0];
       sParams := "";
       for I := 1 to Length(StringArray) - 1 do
         sParams :=  Trim(sParams + " " + StringArray[I]);
     end;
   end;
 end;

 AFilePath := sFile;
 AParams := sParams;
end;

вряд ли подойдет для 100% случаев, но в целом поведение "выполнить" повторяет.



Страницы: 1 2 3 вся ветка

Текущий архив: 2009.11.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.014 c
1-1222244774
andreoman
2008-09-24 12:26
2009.11.01
как узнать в событии OnExit новый активный объект


4-1221118011
dmitry_12_08_73
2008-09-11 11:26
2009.11.01
Функция GetNextWindow ищет не все окна


15-1251750605
Юрий
2009-09-01 00:30
2009.11.01
С днем рождения ! 1 сентября 2009 вторник


15-1251664207
Юрий
2009-08-31 00:30
2009.11.01
С днем рождения ! 31 августа 2009 понедельник


2-1252566358
Андр
2009-09-10 11:05
2009.11.01
удаление ярлыков