Форум: "Прочее";
Текущий архив: 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