Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.007 c
1-1222009517
Дмитрий С
2008-09-21 19:05
2009.11.01
Можно ли самому задать высоту текста для TFont


2-1252760308
EH
2009-09-12 16:58
2009.11.01
DevExpress TVerticalGrid + TcxComboBox


2-1252569523
Shyrick
2009-09-10 11:58
2009.11.01
Обработка log файла


1-1222068508
Decoding
2008-09-22 11:28
2009.11.01
CPL


15-1251810521
xayam
2009-09-01 17:08
2009.11.01
Алгоритм получения ключевых слов в современных поисковиках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский