Помогите распарсить коммандную строку

Джон Лок
Дата: 11.06.2009 17:29:29
Объектная строка применяется и в реестре и в ярлыках и т.д. Она содержит путь к объекту или объектам, а парметры с которыми необходимо выполнить данный объект.

Так вот там бывает что-то типа

C:\test.exe

"C:\test.exe"

RundDll32.EXE "C:\test.exe" /SILENT

"A:\test" "C:\test.exe"

"A:\test" "C:\test.exe" /hibernate, /waitservice

C:\test.exe,NvStartup

и т.д, много всяких вариаций.

Такие простые еще как-то можно расделить на объекты и параметры, но как только я становлюсь уверен что все учел, появляется какой-то путь который взбрыкнет и все перемешает, помогите плз, может есть какая-то функция которой можно скормить строку а она выдаст тебе список объектов и параметров, ну или компонент если есть.
Замучался уже :(.

Всем ответившим заранее спасибо.
Гаджимурадов Рустам
Дата: 11.06.2009 17:47:06
Вопрос не понят. С чем конкретно проблема ?
И приведите Ваш код, который "перемешивается".
Джон Лок
Дата: 11.06.2009 17:57:55
Гаджимурадов Рустам
Вопрос не понят. С чем конкретно проблема ?
И приведите Ваш код, который "перемешивается".


Проблема с распознованием. Что в строке является непосредственно объект, а что параметр с которым он должен выполняться.

Например

"A:\test" "C:\test.exe" - например распарсил

будет

A:\test folder\test.exe - запнется так как вначале непрерывная строка A:\test далее folder\test.exe считается уже другим объектом, то бишь в этом случае надо всю строку загружать, т.е начинаю путаться в пробелах и кавычках и никак не могу составить общий алгоритм который распознает и то и се.
miksoft
Дата: 11.06.2009 18:01:54
хм, если первый символ двойная кавычка, то команда идет до второй двойной кавычки, иначе команда - до первого символа, которого не может быть в коротком имени файла.
Гаджимурадов Рустам
Дата: 11.06.2009 18:02:46
Джон Лок
Что в строке является непосредственно объект, а что параметр с которым он должен выполняться.
Это нельзя никак узнать. Искусственный интеллект еще не придумали.
Вы сами должны знать, что может и должно передаваться в параметрах
к Вашей программе - когда сможете объяснить это словами, можно
будет это запрограммировать, но не раньше.

Джон Лок
т.е начинаю путаться в пробелах и кавычках
Я же сказал - покажите код. А пока - RTFM ParamStr(i).
Джон Лок
Дата: 11.06.2009 18:07:15
Гаджимурадов Рустам
Джон Лок
Что в строке является непосредственно объект, а что параметр с которым он должен выполняться.
Это нельзя никак узнать. Искусственный интеллект еще не придумали.
Вы сами должны знать, что может и должно передаваться в параметрах
к Вашей программе - когда сможете объяснить это словами, можно
будет это запрограммировать, но не раньше.

Джон Лок
т.е начинаю путаться в пробелах и кавычках
Я же сказал - покажите код. А пока - RTFM ParamStr(i).


Но винда же как-то узнает что я ей некорректный путь подсовываю, я выложу код, но еще раз повторю: ребят как только я уверен что предугадал все ситуации тут же вылезет путь который моя процедура распарсит неверно. Мне кажется это изначально неправильный путь парсить такие строки посимвольно самому.

procedure ParsePath(Value: string; var AppName, Params: string);
var
  i: integer;
  AppList, ParamsList: TStringList;

begin
  AppList:= TStringList.Create;
  ParamsList := TStringList.Create;
  AppName := '';
  Params := '';

  try
    i := 1;
    while i <= length(Value) do
    begin
      if (Value[i] <> ' ')
         and
         (Value[i] <> '"')
         and
         (Value[i] <> '/')
         and
         (i <> 1) then
      begin
        if Value[i - 1] = ' ' then
        begin
          if (Pos(' ', Copy(Value, i, length(Value)))-1) <> -1 then
            AppList.Add(Copy(Value,
                             i,
                             Pos(' ', Copy(Value, i, length(Value)))-1
                             )
                       )
          else
            AppList.Add(Copy(Value,
                             i,
                             length(Value)
                             )
                       );
        end;
      end;

      if (i = 1)
         and
         (Value[1] <> ' ')
         and
         (Value[1] <> '"')
         and
         (Value[1] <> '/') then
      begin
        if Pos(' ', Copy(Value, i, length(Value))) <> 0 then
          AppList.Add(Copy(Value,
                           i,
                           Pos(' ', Copy(Value, i, length(Value)))-1
                          )
                     )
        else
          AppList.Add(Copy(Value,
                           i,
                            length(Value)
                          )
                     )
      end;

      if Value[i] = '"' then
      begin
        if (Pos('"', Copy(Value, i + 1, length(Value)))-1) <> -1 then
        begin
          AppList.Add(Copy(Value,
                           i + 1,
                           Pos('"', Copy(Value, i + 1, length(Value)))-1
                          )
                     );
          i := Pos('"', Copy(Value, i + 1, length(Value))) + i;
        end;
      end;

      if Value[i] = '/' then
      begin
        if pos(' ', Copy(Value, i,  pos(' ', Copy(Value, i, length(Value))))) <> 0 then
          ParamsList.Add(Copy(Value,
                              i,
                              pos(' ', Copy(Value, i,  pos(' ', Copy(Value, i, length(Value))))) - 1
                              )
                        )
        else
          ParamsList.Add(Copy(Value,
                              i,
                              length(Value)
                             )
                        );

      end;
      inc(i);
    end;

    for i := 0 to AppList.Count - 1 do
    begin
      if pos(':\', AppList.Strings[i]) = 0 then
        AppList.Strings[i] := GetSystem32Folder + '\' + AppList.Strings[i];

      AppName := AppName + ' ' + AppList.Strings[i];
    end;
    for i  := 0 to ParamsList.Count - 1 do
      Params := Params + ' ' + ParamsList.Strings[i];

    AppName := Copy(AppName, 2, length(AppName));
  finally
    AppList.Free;
    ParamsList.Free;
  end;
end;
Гаджимурадов Рустам
Дата: 11.06.2009 18:09:52
Конечно, изначально неверный.
И где здесь "моя программа" и
ее параметры? А-то я не увидел.
Джон Лок
Дата: 11.06.2009 18:12:02
Гаджимурадов Рустам

А пока - RTFM ParamStr(i).


А как его применить имея только путь? Я понимаю там в своей программе ParamStr(0) покажет полный путь к запускаемой программе, а в моем-то случае она как может помочь?
Джон Лок
Дата: 11.06.2009 18:13:07
Гаджимурадов Рустам
Конечно, изначально неверный.
И где здесь "моя программа" и
ее параметры? А-то я не увидел.


Вот именно что моя программа всего лишь должна выдавать список объектов и параметров по переданному ей строке.
Dimitry Sibiryakov
Дата: 11.06.2009 18:31:49

Джон Лок

моя программа всего лишь должна выдавать список объектов и параметров по
переданному ей строке.

Тогда всё просто:
1) Все части командной строки разделяются пробелами.
2) Всё, что заключено в двойные кавычки считается одним куском.

Апострофы никуда не стучат, так что ты их зря учитываешь.

Posted via ActualForum NNTP Server 1.4